Browse Source

qcacld-3.0: Enable the Partial scan for roam triggers

Currently the roam scan scheme for each trigger is hardcoded to
either full scan or partial scan followed by full scan. Based on
the new requirement for home scenario,the user space configures
roam scan scheme for various triggers. Add support to send scan
scheme type for indvidual roam triggers enabled from userspace.
The default value of roam scan scheme can be modifed for
below roam triggers:
WMI_ROAM_TRIGGER_REASON_PER,WMI_ROAM_TRIGGER_REASON_BMISS,
WMI_ROAM_TRIGGER_REASON_LOW_RSSI,WMI_ROAM_TRIGGER_REASON_BSS_LOAD,
WMI_ROAM_TRIGGER_REASON_BTM

Change-Id: If8b185897b813afc44af362d31172705ea4d7b5c
CRs-Fixed: 2785233
Deeksha Gupta 4 năm trước cách đây
mục cha
commit
a51999d5fa

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

@@ -1128,6 +1128,7 @@ target_if_cm_roam_send_stop(struct wlan_objmgr_vdev *vdev,
 	if (mode == WMI_ROAM_SCAN_MODE_NONE) {
 	if (mode == WMI_ROAM_SCAN_MODE_NONE) {
 		req->roam_triggers.vdev_id = vdev_id;
 		req->roam_triggers.vdev_id = vdev_id;
 		req->roam_triggers.trigger_bitmap = 0;
 		req->roam_triggers.trigger_bitmap = 0;
+		req->roam_triggers.roam_scan_scheme_bitmap = 0;
 		target_if_cm_roam_triggers(vdev, &req->roam_triggers);
 		target_if_cm_roam_triggers(vdev, &req->roam_triggers);
 	}
 	}
 end:
 end:

+ 2 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -116,6 +116,8 @@ cm_roam_triggers(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	params->vdev_id = vdev_id;
 	params->vdev_id = vdev_id;
 	params->trigger_bitmap =
 	params->trigger_bitmap =
 		mlme_get_roam_trigger_bitmap(psoc, vdev_id);
 		mlme_get_roam_trigger_bitmap(psoc, vdev_id);
+	params->roam_scan_scheme_bitmap =
+		wlan_cm_get_roam_scan_scheme_bitmap(psoc, vdev_id);
 	wlan_cm_roam_get_vendor_btm_params(psoc, vdev_id,
 	wlan_cm_roam_get_vendor_btm_params(psoc, vdev_id,
 					   &params->vendor_btm_param);
 					   &params->vendor_btm_param);
 }
 }

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

@@ -95,6 +95,7 @@
 
 
 #define WLAN_MAX_PMK_DUMP_BYTES 6
 #define WLAN_MAX_PMK_DUMP_BYTES 6
 #define DEFAULT_ROAM_SCAN_SCHEME_BITMAP 0
 #define DEFAULT_ROAM_SCAN_SCHEME_BITMAP 0
+#define ROAM_MAX_CFG_VALUE 0xffffffff
 
 
 /**
 /**
  * enum roam_cfg_param  - Type values for roaming parameters used as index
  * enum roam_cfg_param  - Type values for roaming parameters used as index
@@ -163,12 +164,16 @@ struct wlan_cm_roam_vendor_btm_params {
  *		    defined @enum roam_control_trigger_reason
  *		    defined @enum roam_control_trigger_reason
  * @roam_score_delta: Value of roam score delta
  * @roam_score_delta: Value of roam score delta
  * percentage to trigger roam
  * percentage to trigger roam
+ * @roam_scan_scheme_bitmap: Bitmap of roam triggers as defined in
+ * enum roam_trigger_reason, for which the roam scan scheme should
+ * be partial scan
  * @control_param: roam trigger param
  * @control_param: roam trigger param
  */
  */
 struct wlan_roam_triggers {
 struct wlan_roam_triggers {
 	uint32_t vdev_id;
 	uint32_t vdev_id;
 	uint32_t trigger_bitmap;
 	uint32_t trigger_bitmap;
 	uint32_t roam_score_delta;
 	uint32_t roam_score_delta;
+	uint32_t roam_scan_scheme_bitmap;
 	struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
 	struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
 };
 };
 
 

+ 112 - 19
components/wmi/src/wmi_unified_roam_tlv.c

@@ -1356,8 +1356,36 @@ convert_roam_trigger_scan_mode(enum roam_scan_freq_scheme scan_freq_scheme)
 }
 }
 
 
 /**
 /**
- * send_set_roam_trigger_cmd_tlv() - send set roam triggers to fw
+ * wmi_fill_default_roam_trigger_parameters() - Fill the default parameters
+ * for wmi_configure_roam_trigger_parameters tlv.
+ * @roam_trigger_params: pointer to wmi_configure_roam_trigger_parameters tlv
+ * to be filled.
+ * @roam_trigger: Roam trigger reason
  *
  *
+ * Return: None
+ */
+static void wmi_fill_default_roam_trigger_parameters(
+		wmi_configure_roam_trigger_parameters *roam_trigger_params,
+		uint32_t roam_trigger)
+{
+	WMITLV_SET_HDR(&roam_trigger_params->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_configure_roam_trigger_parameters,
+		       WMITLV_GET_STRUCT_TLVLEN(wmi_configure_roam_trigger_parameters));
+
+	roam_trigger_params->trigger_reason = roam_trigger;
+	roam_trigger_params->enable = 1;
+	roam_trigger_params->scan_mode = ROAM_TRIGGER_SCAN_MODE_PARTIAL;
+	roam_trigger_params->trigger_rssi_threshold =
+			ROAM_MAX_CFG_VALUE;
+	roam_trigger_params->cand_ap_min_rssi_threshold =
+			ROAM_MAX_CFG_VALUE;
+	roam_trigger_params->roam_score_delta_percentage =
+			ROAM_MAX_CFG_VALUE;
+	roam_trigger_params->reason_code = ROAM_MAX_CFG_VALUE;
+}
+
+/**
+ * send_set_roam_trigger_cmd_tlv() - send set roam triggers to fw
  * @wmi_handle: wmi handle
  * @wmi_handle: wmi handle
  * @vdev_id: vdev id
  * @vdev_id: vdev id
  * @trigger_bitmap: roam trigger bitmap to be enabled
  * @trigger_bitmap: roam trigger bitmap to be enabled
@@ -1371,14 +1399,34 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle,
 {
 {
 	wmi_buf_t buf;
 	wmi_buf_t buf;
 	wmi_roam_enable_disable_trigger_reason_fixed_param *cmd;
 	wmi_roam_enable_disable_trigger_reason_fixed_param *cmd;
-	uint16_t len = sizeof(*cmd);
+	uint32_t len = sizeof(*cmd);
 	int ret;
 	int ret;
 	uint8_t *buf_ptr;
 	uint8_t *buf_ptr;
 	wmi_configure_roam_trigger_parameters
 	wmi_configure_roam_trigger_parameters
 					*roam_trigger_parameters;
 					*roam_trigger_parameters;
+	uint32_t num_triggers_enabled = 0;
+	uint32_t roam_scan_scheme_bitmap = triggers->roam_scan_scheme_bitmap;
+	uint32_t total_tlv_len;
 
 
-	len += WMI_TLV_HDR_SIZE +
-		sizeof(wmi_configure_roam_trigger_parameters);
+	if (BIT(ROAM_TRIGGER_REASON_PER) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
+	if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
+	if (BIT(ROAM_TRIGGER_REASON_LOW_RSSI) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
+	if (BIT(ROAM_TRIGGER_REASON_BTM) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
+	if (BIT(ROAM_TRIGGER_REASON_BSS_LOAD) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
+	total_tlv_len = sizeof(wmi_configure_roam_trigger_parameters) +
+			num_triggers_enabled *
+			sizeof(wmi_configure_roam_trigger_parameters);
+	len += WMI_TLV_HDR_SIZE + total_tlv_len;
 
 
 	buf = wmi_buf_alloc(wmi_handle, len);
 	buf = wmi_buf_alloc(wmi_handle, len);
 	if (!buf) {
 	if (!buf) {
@@ -1392,45 +1440,90 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle,
 					wmi_buf_data(buf);
 					wmi_buf_data(buf);
 	WMITLV_SET_HDR(&cmd->tlv_header,
 	WMITLV_SET_HDR(&cmd->tlv_header,
 	WMITLV_TAG_STRUC_wmi_roam_enable_disable_trigger_reason_fixed_param,
 	WMITLV_TAG_STRUC_wmi_roam_enable_disable_trigger_reason_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-		      (wmi_roam_enable_disable_trigger_reason_fixed_param));
+	WMITLV_GET_STRUCT_TLVLEN(wmi_roam_enable_disable_trigger_reason_fixed_param));
+
 	cmd->vdev_id = triggers->vdev_id;
 	cmd->vdev_id = triggers->vdev_id;
 	cmd->trigger_reason_bitmask =
 	cmd->trigger_reason_bitmask =
 	   convert_control_roam_trigger_reason_bitmap(triggers->trigger_bitmap);
 	   convert_control_roam_trigger_reason_bitmap(triggers->trigger_bitmap);
-	wmi_debug("Received trigger bitmap: 0x%x converted trigger_bitmap: 0x%x",
-		 triggers->trigger_bitmap, cmd->trigger_reason_bitmask);
+	wmi_debug("RSO_CFG: Received trigger bitmap: 0x%x converted trigger_bitmap: 0x%x",
+		  triggers->trigger_bitmap, cmd->trigger_reason_bitmask);
 	cmd->trigger_reason_bitmask |= get_internal_mandatory_roam_triggers();
 	cmd->trigger_reason_bitmask |= get_internal_mandatory_roam_triggers();
-	wmi_debug("vdev id: %d final trigger_bitmap: 0x%x",
-		 cmd->vdev_id, cmd->trigger_reason_bitmask);
+	wmi_debug("RSO_CFG: vdev id: %d final trigger_bitmap: 0x%x roam_scan_scheme:0x%x num_triggers_enabled:%d",
+		  cmd->vdev_id, cmd->trigger_reason_bitmask,
+		  roam_scan_scheme_bitmap, num_triggers_enabled);
 
 
 	buf_ptr += sizeof(wmi_roam_enable_disable_trigger_reason_fixed_param);
 	buf_ptr += sizeof(wmi_roam_enable_disable_trigger_reason_fixed_param);
-	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
-		sizeof(wmi_configure_roam_trigger_parameters));
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, total_tlv_len);
 	buf_ptr += WMI_TLV_HDR_SIZE;
 	buf_ptr += WMI_TLV_HDR_SIZE;
 
 
 	roam_trigger_parameters =
 	roam_trigger_parameters =
 		(wmi_configure_roam_trigger_parameters *)buf_ptr;
 		(wmi_configure_roam_trigger_parameters *)buf_ptr;
+
 	WMITLV_SET_HDR(&roam_trigger_parameters->tlv_header,
 	WMITLV_SET_HDR(&roam_trigger_parameters->tlv_header,
 		WMITLV_TAG_STRUC_wmi_configure_roam_trigger_parameters,
 		WMITLV_TAG_STRUC_wmi_configure_roam_trigger_parameters,
 		WMITLV_GET_STRUCT_TLVLEN(
 		WMITLV_GET_STRUCT_TLVLEN(
 			wmi_configure_roam_trigger_parameters));
 			wmi_configure_roam_trigger_parameters));
-
 	roam_trigger_parameters->trigger_reason =
 	roam_trigger_parameters->trigger_reason =
-				WMI_ROAM_TRIGGER_REASON_WTC_BTM;
+			WMI_ROAM_TRIGGER_REASON_WTC_BTM;
 	if (triggers->vendor_btm_param.user_roam_reason == 0)
 	if (triggers->vendor_btm_param.user_roam_reason == 0)
 		roam_trigger_parameters->enable = 1;
 		roam_trigger_parameters->enable = 1;
-	roam_trigger_parameters->scan_mode =
-		convert_roam_trigger_scan_mode(triggers->vendor_btm_param.
-							scan_freq_scheme);
+	roam_trigger_parameters->scan_mode = convert_roam_trigger_scan_mode(
+				triggers->vendor_btm_param.scan_freq_scheme);
 	roam_trigger_parameters->trigger_rssi_threshold =
 	roam_trigger_parameters->trigger_rssi_threshold =
-			triggers->vendor_btm_param.connected_rssi_threshold;
+		triggers->vendor_btm_param.connected_rssi_threshold;
 	roam_trigger_parameters->cand_ap_min_rssi_threshold =
 	roam_trigger_parameters->cand_ap_min_rssi_threshold =
-			triggers->vendor_btm_param.candidate_rssi_threshold;
+		triggers->vendor_btm_param.candidate_rssi_threshold;
 	roam_trigger_parameters->roam_score_delta_percentage =
 	roam_trigger_parameters->roam_score_delta_percentage =
 			triggers->roam_score_delta;
 			triggers->roam_score_delta;
 	roam_trigger_parameters->reason_code =
 	roam_trigger_parameters->reason_code =
 			triggers->vendor_btm_param.user_roam_reason;
 			triggers->vendor_btm_param.user_roam_reason;
 
 
+	roam_trigger_parameters++;
+
+	if (num_triggers_enabled == 0)
+		goto send;
+
+	if (BIT(ROAM_TRIGGER_REASON_PER) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_PER);
+
+		roam_trigger_parameters++;
+	}
+
+	if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_BMISS);
+
+		roam_trigger_parameters++;
+	}
+
+	if (BIT(ROAM_TRIGGER_REASON_LOW_RSSI) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_LOW_RSSI);
+
+		roam_trigger_parameters++;
+	}
+
+	if (BIT(ROAM_TRIGGER_REASON_BTM) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_BTM);
+
+		roam_trigger_parameters++;
+	}
+
+	if (BIT(ROAM_TRIGGER_REASON_BSS_LOAD) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_BSS_LOAD);
+
+		roam_trigger_parameters++;
+	}
+
+send:
 	wmi_mtrace(WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID,
 	wmi_mtrace(WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID,
 		   triggers->vdev_id, 0);
 		   triggers->vdev_id, 0);
 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,

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

@@ -16992,7 +16992,10 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx,
 	req_buf->roam_triggers.trigger_bitmap =
 	req_buf->roam_triggers.trigger_bitmap =
 		mlme_get_roam_trigger_bitmap(mac_ctx->psoc, session->vdev_id);
 		mlme_get_roam_trigger_bitmap(mac_ctx->psoc, session->vdev_id);
 	req_buf->roam_triggers.roam_score_delta =
 	req_buf->roam_triggers.roam_score_delta =
-			mac_ctx->mlme_cfg->roam_scoring.roam_score_delta;
+		mac_ctx->mlme_cfg->roam_scoring.roam_score_delta;
+	req_buf->roam_triggers.roam_scan_scheme_bitmap =
+		wlan_cm_get_roam_scan_scheme_bitmap(mac_ctx->psoc,
+						    session->vdev_id);
 
 
 	req_buf->RoamKeyMgmtOffloadEnabled = session->RoamKeyMgmtOffloadEnabled;
 	req_buf->RoamKeyMgmtOffloadEnabled = session->RoamKeyMgmtOffloadEnabled;
 	req_buf->pmkid_modes.fw_okc =
 	req_buf->pmkid_modes.fw_okc =

+ 1 - 0
core/wma/src/wma_scan_roam.c

@@ -2192,6 +2192,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
 
 
 			roam_triggers.vdev_id = roam_req->sessionId;
 			roam_triggers.vdev_id = roam_req->sessionId;
 			roam_triggers.trigger_bitmap = 0;
 			roam_triggers.trigger_bitmap = 0;
+			roam_triggers.roam_scan_scheme_bitmap = 0;
 			wma_set_roam_triggers(wma_handle, &roam_triggers);
 			wma_set_roam_triggers(wma_handle, &roam_triggers);
 		}
 		}