Browse Source

qcacld-3.0: Add 3 ini for data rssi check when roaming

3 ini:
roam_data_rssi_threshold_triggers
roam_data_rssi_threshold
rx_data_inactivity_time
If there's rx activity during latest rx_data_inactivity_time
and avg of data_rssi is better than roam_data_rssi_threshold, then
suppress roaming triggered by roam_data_rssi_threshold_triggers: low
RSSI or bg scan.

Change-Id: I5b41c4119e61392b50e52ab8ccb8650e5758f3b3
CRs-Fixed: 2768053
Jianmin Zhu 4 years ago
parent
commit
e7c9718446

+ 6 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -1639,6 +1639,12 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
 		cfg_get(psoc, CFG_LFR_ROAM_BG_SCAN_CLIENT_BITMAP);
 	lfr->roam_bg_scan_bad_rssi_offset_2g =
 		cfg_get(psoc, CFG_LFR_ROAM_BG_SCAN_BAD_RSSI_OFFSET_2G);
+	lfr->roam_data_rssi_threshold_triggers =
+		cfg_get(psoc, CFG_ROAM_DATA_RSSI_THRESHOLD_TRIGGERS);
+	lfr->roam_data_rssi_threshold =
+		cfg_get(psoc, CFG_ROAM_DATA_RSSI_THRESHOLD);
+	lfr->rx_data_inactivity_time =
+		cfg_get(psoc, CFG_RX_DATA_INACTIVITY_TIME);
 	lfr->adaptive_roamscan_dwell_mode =
 		cfg_get(psoc, CFG_LFR_ADAPTIVE_ROAMSCAN_DWELL_MODE);
 	lfr->per_roam_enable =

+ 90 - 0
components/mlme/dispatcher/inc/cfg_mlme_lfr.h

@@ -500,6 +500,93 @@
 	CFG_VALUE_OR_DEFAULT, \
 	"RSSI threshold offset for 2G to 5G roam")
 
+/*
+ * <ini>
+ * roam_data_rssi_threshold_triggers - triggers of data rssi threshold for roam
+ * @Min: 0
+ * @Max: 0xffff
+ * @Default: 0
+ *
+ * If the DUT is connected to an AP with weak signal, during latest
+ * rx_data_inactivity_time, if there is no activity or avg of data_rssi is
+ * better than roam_data_rssi_threshold(-70dbM), then suppress roaming
+ * triggered by roam_data_rssi_threshold_triggers: low RSSI or bg scan.
+ * Triggers bitmap definition:
+ * ROAM_DATA_RSSI_FLAG_LOW_RSSI   1<<0
+ * ROAM_DATA_RSSI_FLAG_BACKGROUND 1<<1
+ *
+ * Related: None
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ROAM_DATA_RSSI_THRESHOLD_TRIGGERS CFG_INI_UINT( \
+	"roam_data_rssi_threshold_triggers", \
+	0, \
+	0xffff, \
+	0x3, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Triggers of DATA RSSI threshold for roam")
+
+/*
+ * <ini>
+ * roam_data_rssi_threshold - Data RSSI threshold for background roam
+ * @Min: -96
+ * @Max: 0
+ * @Default: -70
+ *
+ * If the DUT is connected to an AP with weak signal, during latest
+ * rx_data_inactivity_time, if there is no activity or avg of data_rssi is
+ * better than roam_data_rssi_threshold(-70dbM), then suppress roaming
+ * triggered by roam_data_rssi_threshold_triggers: low RSSI or bg scan.
+ *
+ * Related: None
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ROAM_DATA_RSSI_THRESHOLD CFG_INI_INT( \
+	"roam_data_rssi_threshold", \
+	-96, \
+	0, \
+	-70, \
+	CFG_VALUE_OR_DEFAULT, \
+	"DATA RSSI threshold for roam")
+
+/*
+ * <ini>
+ * rx_data_inactivity_time - Duration to check data rssi
+ * @Min: 0
+ * @Max: 100000 ms
+ * @Default: 2000
+ *
+ * If the DUT is connected to an AP with weak signal, during latest
+ * rx_data_inactivity_time, if there is no activity or avg of data_rssi is
+ * better than roam_data_rssi_threshold(-70dbM), then suppress roaming
+ * triggered by roam_data_rssi_threshold_triggers: low RSSI or bg scan.
+ *
+ * Related: None
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RX_DATA_INACTIVITY_TIME CFG_INI_UINT( \
+	"rx_data_inactivity_time", \
+	0, \
+	100000, \
+	2000, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Rx inactivity time to check data rssi")
+
 /*
  * <ini>
  * roamscan_adaptive_dwell_mode - Sets dwell time adaptive mode
@@ -2778,6 +2865,9 @@
 	CFG(CFG_LFR_ROAM_BG_SCAN_BAD_RSSI_THRESHOLD) \
 	CFG(CFG_LFR_ROAM_BG_SCAN_CLIENT_BITMAP) \
 	CFG(CFG_LFR_ROAM_BG_SCAN_BAD_RSSI_OFFSET_2G) \
+	CFG(CFG_ROAM_DATA_RSSI_THRESHOLD_TRIGGERS) \
+	CFG(CFG_ROAM_DATA_RSSI_THRESHOLD) \
+	CFG(CFG_RX_DATA_INACTIVITY_TIME) \
 	CFG(CFG_LFR_ADAPTIVE_ROAMSCAN_DWELL_MODE) \
 	CFG(CFG_LFR_PER_ROAM_ENABLE) \
 	CFG(CFG_LFR_PER_ROAM_CONFIG_HIGH_RATE_TH) \

+ 7 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1585,6 +1585,10 @@ struct fw_scan_channels {
  * @roam_bg_scan_bad_rssi_threshold:RSSI threshold for background roam
  * @roam_bg_scan_client_bitmap:     Bitmap used to identify the scan clients
  * @roam_bg_scan_bad_rssi_offset_2g:RSSI threshold offset for 2G to 5G roam
+ * @roam_data_rssi_threshold_triggers: triggers of bad data RSSI threshold to
+ *                                  roam
+ * @roam_data_rssi_threshold: Bad data RSSI threshold to roam
+ * @rx_data_inactivity_time: Rx duration to check data RSSI
  * @adaptive_roamscan_dwell_mode:   Sets dwell time adaptive mode
  * @per_roam_enable:                To enabled/disable PER based roaming in FW
  * @per_roam_config_high_rate_th:   Rate at which PER based roam will stop
@@ -1696,6 +1700,9 @@ struct wlan_mlme_lfr_cfg {
 	uint32_t roam_bg_scan_bad_rssi_threshold;
 	uint32_t roam_bg_scan_client_bitmap;
 	uint32_t roam_bg_scan_bad_rssi_offset_2g;
+	uint32_t roam_data_rssi_threshold_triggers;
+	int32_t roam_data_rssi_threshold;
+	uint32_t rx_data_inactivity_time;
 	uint32_t adaptive_roamscan_dwell_mode;
 	uint32_t per_roam_enable;
 	uint32_t per_roam_config_high_rate_th;

+ 5 - 0
components/target_if/connection_mgr/src/target_if_cm_roam_offload.c

@@ -388,6 +388,7 @@ target_if_cm_roam_scan_offload_rssi_thresh(
 		req->rssi_thresh &= 0x000000ff;
 		req->hi_rssi_scan_rssi_ub -= NOISE_FLOOR_DBM_DEFAULT;
 		req->bg_scan_bad_rssi_thresh -= NOISE_FLOOR_DBM_DEFAULT;
+		req->roam_data_rssi_threshold -= NOISE_FLOOR_DBM_DEFAULT;
 		req->good_rssi_threshold -= NOISE_FLOOR_DBM_DEFAULT;
 		req->good_rssi_threshold &= 0x000000ff;
 	}
@@ -466,6 +467,10 @@ target_if_cm_roam_scan_offload_rssi_thresh(
 			req->bg_scan_bad_rssi_thresh,
 			req->bg_scan_client_bitmap,
 			req->roam_bad_rssi_thresh_offset_2g);
+	target_if_debug("Roam data rssi triggers:0x%x, threshold:%d, rx time:%d",
+			req->roam_data_rssi_threshold_triggers,
+			req->roam_data_rssi_threshold,
+			req->rx_data_inactivity_time);
 
 	status = wmi_unified_roam_scan_offload_rssi_thresh_cmd(wmi_handle, req);
 	if (QDF_IS_STATUS_ERROR(status)) {

+ 7 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -927,6 +927,10 @@ struct wlan_roam_scan_offload_params {
  * @roam_bad_rssi_thresh_offset_2g: Offset from Bad RSSI threshold for 2G
  *                                  to 5G Roam
  * @bg_scan_client_bitmap: Bitmap used to identify the client scans to snoop
+ * @roam_data_rssi_threshold_triggers: triggers of bad data RSSI threshold to
+ *                                  roam
+ * @roam_data_rssi_threshold: Bad data RSSI threshold to roam
+ * @rx_data_inactivity_time: Rx duration to check data RSSI
  */
 struct wlan_roam_offload_scan_rssi_params {
 	int8_t rssi_thresh;
@@ -955,6 +959,9 @@ struct wlan_roam_offload_scan_rssi_params {
 	int8_t bg_scan_bad_rssi_thresh;
 	uint8_t roam_bad_rssi_thresh_offset_2g;
 	uint32_t bg_scan_client_bitmap;
+	uint32_t roam_data_rssi_threshold_triggers;
+	int32_t roam_data_rssi_threshold;
+	uint32_t rx_data_inactivity_time;
 };
 
 /**

+ 7 - 0
components/wmi/inc/wmi_unified_roam_param.h

@@ -95,6 +95,10 @@ struct rssi_monitor_param {
  * @roam_bad_rssi_thresh_offset_2g: Offset from Bad RSSI threshold for 2G
  *                                  to 5G Roam
  * @bg_scan_client_bitmap: Bitmap used to identify the client scans to snoop
+ * @roam_data_rssi_threshold_triggers: triggers of bad data RSSI threshold to
+ *                                  roam
+ * @roam_data_rssi_threshold: Bad data RSSI threshold to roam
+ * @rx_data_inactivity_time: Rx duration to check data RSSI
  * @flags: Flags for Background Roaming
  *	Bit 0 : BG roaming enabled when we connect to 2G AP only and roaming
  *	        to 5G AP only.
@@ -125,6 +129,9 @@ struct roam_offload_scan_rssi_params {
 	int8_t bg_scan_bad_rssi_thresh;
 	uint8_t roam_bad_rssi_thresh_offset_2g;
 	uint32_t bg_scan_client_bitmap;
+	uint32_t roam_data_rssi_threshold_triggers;
+	int32_t roam_data_rssi_threshold;
+	uint32_t rx_data_inactivity_time;
 	uint32_t flags;
 };
 

+ 40 - 0
components/wmi/src/wmi_unified_roam_tlv.c

@@ -179,6 +179,7 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 	wmi_roam_earlystop_rssi_thres_param *early_stop_thresholds = NULL;
 	wmi_roam_dense_thres_param *dense_thresholds = NULL;
 	wmi_roam_bg_scan_roaming_param *bg_scan_params = NULL;
+	wmi_roam_data_rssi_roaming_param *data_rssi_param = NULL;
 
 	len = sizeof(wmi_roam_scan_rssi_threshold_fixed_param);
 	len += WMI_TLV_HDR_SIZE; /* TLV for ext_thresholds*/
@@ -189,6 +190,8 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 	len += sizeof(wmi_roam_dense_thres_param);
 	len += WMI_TLV_HDR_SIZE; /* TLV for BG Scan*/
 	len += sizeof(wmi_roam_bg_scan_roaming_param);
+	len += WMI_TLV_HDR_SIZE; /* TLV for data RSSI*/
+	len += sizeof(wmi_roam_data_rssi_roaming_param);
 	buf = wmi_buf_alloc(wmi_handle, len);
 	if (!buf)
 		return QDF_STATUS_E_NOMEM;
@@ -289,6 +292,26 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 		       WMITLV_GET_STRUCT_TLVLEN
 		       (wmi_roam_bg_scan_roaming_param));
 
+	buf_ptr += sizeof(wmi_roam_bg_scan_roaming_param);
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+		       sizeof(wmi_roam_data_rssi_roaming_param));
+	buf_ptr += WMI_TLV_HDR_SIZE;
+	data_rssi_param = (wmi_roam_data_rssi_roaming_param *)buf_ptr;
+	data_rssi_param->flags =
+		roam_req->roam_data_rssi_threshold_triggers;
+	data_rssi_param->roam_data_rssi_thres =
+		roam_req->roam_data_rssi_threshold;
+	data_rssi_param->rx_inactivity_ms =
+		roam_req->rx_data_inactivity_time;
+	WMITLV_SET_HDR(&data_rssi_param->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_roam_data_rssi_roaming_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_roam_data_rssi_roaming_param));
+	WMI_LOGD("Data rssi threshold: %d, triggers: 0x%x, rx time: %d",
+		 data_rssi_param->roam_data_rssi_thres,
+		 data_rssi_param->flags,
+		 data_rssi_param->rx_inactivity_ms);
+
 	wmi_mtrace(WMI_ROAM_SCAN_RSSI_THRESHOLD, NO_SESSION, 0);
 	status = wmi_unified_cmd_send(wmi_handle, buf,
 				      len, WMI_ROAM_SCAN_RSSI_THRESHOLD);
@@ -383,6 +406,7 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 	wmi_roam_earlystop_rssi_thres_param *early_stop_thresholds = NULL;
 	wmi_roam_dense_thres_param *dense_thresholds = NULL;
 	wmi_roam_bg_scan_roaming_param *bg_scan_params = NULL;
+	wmi_roam_data_rssi_roaming_param *data_rssi_param = NULL;
 
 	len = sizeof(wmi_roam_scan_rssi_threshold_fixed_param);
 	len += WMI_TLV_HDR_SIZE; /* TLV for ext_thresholds*/
@@ -489,6 +513,22 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 		       WMITLV_GET_STRUCT_TLVLEN
 		       (wmi_roam_bg_scan_roaming_param));
 
+	buf_ptr += sizeof(wmi_roam_bg_scan_roaming_param);
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+		       sizeof(wmi_roam_data_rssi_roaming_param));
+	buf_ptr += WMI_TLV_HDR_SIZE;
+	data_rssi_param = (wmi_roam_data_rssi_roaming_param *)buf_ptr;
+	data_rssi_param->flags =
+		roam_req->roam_data_rssi_threshold_triggers;
+	data_rssi_param->roam_data_rssi_thres =
+		roam_req->roam_data_rssi_threshold;
+	data_rssi_param->rx_inactivity_ms =
+			roam_req->rx_data_inactivity_time;
+	WMITLV_SET_HDR(&data_rssi_param->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_roam_data_rssi_roaming_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_roam_data_rssi_roaming_param));
+
 	wmi_mtrace(WMI_ROAM_SCAN_RSSI_THRESHOLD, NO_SESSION, 0);
 	status = wmi_unified_cmd_send(wmi_handle, buf,
 				      len, WMI_ROAM_SCAN_RSSI_THRESHOLD);

+ 6 - 0
core/mac/inc/sir_api.h

@@ -2148,6 +2148,9 @@ typedef enum {
  * @bg_scan_bad_rssi_thresh:    Bad RSSI threshold to perform bg scan.
  * @bad_rssi_thresh_offset_2g:  Offset from Bad RSSI threshold for 2G to 5G Roam
  * @bg_scan_client_bitmap:      Bitmap to identify the client scans to snoop.
+ * @roam_data_rssi_threshold_triggers:    Bad data RSSI threshold to roam
+ * @roam_data_rssi_threshold:    Bad data RSSI threshold to roam
+ * @rx_data_inactivity_time:    rx duration to check data RSSI
  *
  * This structure holds all the key parameters related to
  * initial connection and also roaming connections.
@@ -2181,6 +2184,9 @@ struct roam_ext_params {
 	int8_t bg_scan_bad_rssi_thresh;
 	uint8_t roam_bad_rssi_thresh_offset_2g;
 	uint32_t bg_scan_client_bitmap;
+	uint32_t roam_data_rssi_threshold_triggers;
+	int32_t roam_data_rssi_threshold;
+	uint32_t rx_data_inactivity_time;
 };
 
 /**

+ 3 - 0
core/sme/inc/csr_api.h

@@ -901,6 +901,9 @@ struct csr_config_params {
 	uint32_t roam_dense_min_aps;
 	int8_t roam_bg_scan_bad_rssi_thresh;
 	uint8_t roam_bad_rssi_thresh_offset_2g;
+	uint32_t roam_data_rssi_threshold_triggers;
+	int32_t roam_data_rssi_threshold;
+	uint32_t rx_data_inactivity_time;
 	struct csr_sta_roam_policy_params sta_roam_policy_params;
 	enum force_1x1_type is_force_1x1;
 	uint32_t offload_11k_enable_bitmask;

+ 18 - 1
core/sme/src/csr/csr_api_roam.c

@@ -2775,6 +2775,12 @@ QDF_STATUS csr_get_config_param(struct mac_context *mac,
 		cfg_params->roam_params.bg_scan_bad_rssi_thresh;
 	pParam->roam_bad_rssi_thresh_offset_2g =
 		cfg_params->roam_params.roam_bad_rssi_thresh_offset_2g;
+	pParam->roam_data_rssi_threshold_triggers =
+		cfg_params->roam_params.roam_data_rssi_threshold_triggers;
+	pParam->roam_data_rssi_threshold =
+		cfg_params->roam_params.roam_data_rssi_threshold;
+	pParam->rx_data_inactivity_time =
+		cfg_params->roam_params.rx_data_inactivity_time;
 
 	pParam->conc_custom_rule1 = cfg_params->conc_custom_rule1;
 	pParam->conc_custom_rule2 = cfg_params->conc_custom_rule2;
@@ -19429,6 +19435,12 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
 		mac_ctx->mlme_cfg->lfr.roam_bg_scan_client_bitmap;
 	roam_params_dst->roam_bad_rssi_thresh_offset_2g =
 		mac_ctx->mlme_cfg->lfr.roam_bg_scan_bad_rssi_offset_2g;
+	roam_params_dst->roam_data_rssi_threshold_triggers =
+		mac_ctx->mlme_cfg->lfr.roam_data_rssi_threshold_triggers;
+	roam_params_dst->roam_data_rssi_threshold =
+		mac_ctx->mlme_cfg->lfr.roam_data_rssi_threshold;
+	roam_params_dst->rx_data_inactivity_time =
+		mac_ctx->mlme_cfg->lfr.rx_data_inactivity_time;
 	roam_params_dst->raise_rssi_thresh_5g =
 		mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g;
 	roam_params_dst->drop_rssi_thresh_5g =
@@ -19748,11 +19760,16 @@ csr_cm_roam_scan_offload_rssi_thresh(struct mac_context *mac_ctx,
 
 	params->bg_scan_bad_rssi_thresh =
 		mac_ctx->mlme_cfg->lfr.roam_bg_scan_bad_rssi_threshold;
-
 	params->bg_scan_client_bitmap =
 		mac_ctx->mlme_cfg->lfr.roam_bg_scan_client_bitmap;
 	params->roam_bad_rssi_thresh_offset_2g =
 			mac_ctx->mlme_cfg->lfr.roam_bg_scan_bad_rssi_offset_2g;
+	params->roam_data_rssi_threshold_triggers =
+		mac_ctx->mlme_cfg->lfr.roam_data_rssi_threshold_triggers;
+	params->roam_data_rssi_threshold =
+		mac_ctx->mlme_cfg->lfr.roam_data_rssi_threshold;
+	params->rx_data_inactivity_time =
+		mac_ctx->mlme_cfg->lfr.rx_data_inactivity_time;
 
 	params->drop_rssi_thresh_5g =
 		mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g;

+ 15 - 5
core/wma/src/wma_scan_roam.c

@@ -586,13 +586,19 @@ wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 	params.traffic_threshold =
 			roam_params->traffic_threshold;
 	params.initial_dense_status = roam_params->initial_dense_status;
-	if (db2dbm_enabled)
+	if (db2dbm_enabled) {
 		params.bg_scan_bad_rssi_thresh =
 					   roam_params->bg_scan_bad_rssi_thresh;
-	else
-		params.bg_scan_bad_rssi_thresh =
-					  roam_params->bg_scan_bad_rssi_thresh -
-					  WMA_NOISE_FLOOR_DBM_DEFAULT;
+		params.roam_data_rssi_threshold =
+					roam_params->roam_data_rssi_threshold;
+	} else {
+		params.roam_data_rssi_threshold =
+				roam_params->roam_data_rssi_threshold -
+				WMA_NOISE_FLOOR_DBM_DEFAULT;
+		params.roam_data_rssi_threshold =
+					roam_params->roam_data_rssi_threshold -
+					WMA_NOISE_FLOOR_DBM_DEFAULT;
+	}
 
 	params.bg_scan_client_bitmap = roam_params->bg_scan_client_bitmap;
 	params.roam_bad_rssi_thresh_offset_2g =
@@ -706,6 +712,10 @@ wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 		  roam_params->bg_scan_bad_rssi_thresh,
 		  roam_params->bg_scan_client_bitmap,
 		  roam_params->roam_bad_rssi_thresh_offset_2g);
+	wma_debug("Roam data rssi triggers:0x%x, threshold:%d, rx time:%d",
+		  roam_params->roam_data_rssi_threshold_triggers,
+		  roam_params->roam_data_rssi_threshold,
+		  roam_params->rx_data_inactivity_time);
 	return status;
 }