Переглянути джерело

qcacld-3.0: Add new BT Coex roam trigger reason

Send additional roam trigger TLV for BTC in
WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID
command, to support a new roaming trigger
"WMI_ROAM_TRIGGER_REASON_BTC".

Change-Id: Ib767bd6bcf005c187b0fb58986ad287fe8753c1b
CRs-Fixed: 3009788
abhinav kumar 3 роки тому
батько
коміт
3173789d99

+ 2 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -3958,6 +3958,8 @@ char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)
 		return "NONE";
 	case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT:
 		return "PMK Expired";
+	case WMI_ROAM_TRIGGER_REASON_BTC:
+		return "BTC TRIGGER";
 	default:
 		return "UNKNOWN";
 	}

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

@@ -345,8 +345,6 @@ target_if_cm_roam_idle_params(wmi_unified_t wmi_handle, uint8_t command,
 	switch (command) {
 	case ROAM_SCAN_OFFLOAD_START:
 	case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
-		if (!req->enable)
-			return;
 		break;
 	case ROAM_SCAN_OFFLOAD_STOP:
 		req->enable = false;

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

@@ -40,6 +40,7 @@
 #include "connection_mgr/core/src/wlan_cm_roam.h"
 #include "connection_mgr/core/src/wlan_cm_main.h"
 #include "connection_mgr/core/src/wlan_cm_sm.h"
+#include "wlan_reg_ucfg_api.h"
 
 #ifdef WLAN_FEATURE_SAE
 #define CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap) \
@@ -162,6 +163,53 @@ cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	params->enable_roam_reason_vsie = enable_roam_reason_vsie;
 }
 
+/**
+ * cm_is_only_2g_band_supported()  - Check if BTC trigger and IDLE trigger needs
+ * to be disabled based on the current connected band.
+ * @psoc:   Pointer to the psoc object
+ * @vdev_id: Vdev id
+ *
+ * Return: true if BTC trigger and IDLE trigger are allowed or not
+ */
+static bool
+cm_is_only_2g_band_supported(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev;
+	bool only_2g_band_supported = false;
+	uint32_t band_bitmap;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("Vdev is null for vdev_id:%d", vdev_id);
+		return false;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		mlme_err("pdev is null for vdev_id:%d", vdev_id);
+		goto release;
+	}
+
+	if (QDF_IS_STATUS_ERROR(ucfg_reg_get_band(pdev, &band_bitmap))) {
+		mlme_debug("Failed to get band");
+		goto release;
+	}
+
+	mlme_debug("Current band bitmap:%d", band_bitmap);
+
+	if (band_bitmap & BIT(REG_BAND_2G) &&
+	    !(band_bitmap & BIT(REG_BAND_5G)) &&
+	    !(band_bitmap & BIT(REG_BAND_6G)))
+		only_2g_band_supported = true;
+
+
+release:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+	return only_2g_band_supported;
+}
+
 /**
  * cm_roam_triggers() - set roam triggers
  * @psoc: psoc pointer
@@ -191,6 +239,17 @@ cm_roam_triggers(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	if (!is_per_roam_enabled)
 		params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_PER);
 
+	/*
+	 * Enable BTC trigger and IDLE trigger only when DUT is dual band
+	 * capable(2g + 5g/6g)
+	 */
+	if (cm_is_only_2g_band_supported(psoc, vdev_id)) {
+		params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_IDLE);
+		params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_BTC);
+	}
+
+	mlme_debug("[ROAM_TRIGGER] trigger_bitmap:%d", params->trigger_bitmap);
+
 	params->roam_scan_scheme_bitmap =
 		wlan_cm_get_roam_scan_scheme_bitmap(psoc, vdev_id);
 	wlan_cm_roam_get_vendor_btm_params(psoc, &params->vendor_btm_param);
@@ -2491,6 +2550,10 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	cm_roam_bss_load_config(psoc, vdev_id, &start_req->bss_load_config);
 	cm_roam_disconnect_params(psoc, vdev_id, &start_req->disconnect_params);
 	cm_roam_idle_params(psoc, vdev_id, &start_req->idle_params);
+	if (!(BIT(ROAM_TRIGGER_REASON_IDLE) &
+	    start_req->roam_triggers.trigger_bitmap))
+		start_req->idle_params.enable = false;
+
 	cm_roam_scan_offload_rssi_thresh(psoc, vdev_id,
 					 &start_req->rssi_params, rso_cfg);
 	cm_roam_scan_offload_scan_period(vdev_id,
@@ -2568,10 +2631,13 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	if (MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
 		cm_roam_disconnect_params(psoc, vdev_id,
 					  &update_req->disconnect_params);
-		cm_roam_idle_params(psoc, vdev_id,
-				    &update_req->idle_params);
 		cm_roam_triggers(psoc, vdev_id,
 				 &update_req->roam_triggers);
+		cm_roam_idle_params(psoc, vdev_id,
+				    &update_req->idle_params);
+		if (!(BIT(ROAM_TRIGGER_REASON_IDLE) &
+		    update_req->roam_triggers.trigger_bitmap))
+			update_req->idle_params.enable = false;
 	}
 	cm_roam_scan_offload_rssi_thresh(psoc, vdev_id,
 					 &update_req->rssi_params, rso_cfg);

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

@@ -823,6 +823,8 @@ convert_roam_trigger_reason(enum roam_trigger_reason trigger_reason)
 		return WMI_ROAM_TRIGGER_REASON_WTC_BTM;
 	case ROAM_TRIGGER_REASON_PMK_TIMEOUT:
 		return WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT;
+	case ROAM_TRIGGER_REASON_BTC:
+		return WMI_ROAM_TRIGGER_REASON_BTC;
 	case ROAM_TRIGGER_REASON_MAX:
 		return WMI_ROAM_TRIGGER_REASON_MAX;
 	default:
@@ -1312,6 +1314,9 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle,
 	if (BIT(ROAM_TRIGGER_REASON_PER) & roam_scan_scheme_bitmap)
 		num_triggers_enabled++;
 
+	if (BIT(ROAM_TRIGGER_REASON_BTC) & roam_scan_scheme_bitmap)
+		num_triggers_enabled++;
+
 	if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap)
 		num_triggers_enabled++;
 
@@ -1395,6 +1400,12 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle,
 		wmi_fill_score_delta_params(roam_trigger_parameters,
 					    triggers,
 					    IDLE_ROAM_TRIGGER);
+		if (cmd->trigger_reason_bitmask &
+		    BIT(WMI_ROAM_TRIGGER_REASON_IDLE))
+			roam_trigger_parameters->enable = 1;
+		else
+			roam_trigger_parameters->enable = 0;
+
 		roam_trigger_parameters++;
 
 		wmi_fill_score_delta_params(roam_trigger_parameters,
@@ -1444,6 +1455,16 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle,
 		roam_trigger_parameters++;
 	}
 
+	if (BIT(ROAM_TRIGGER_REASON_BTC) & roam_scan_scheme_bitmap) {
+		wmi_fill_default_roam_trigger_parameters(
+				roam_trigger_parameters,
+				WMI_ROAM_TRIGGER_REASON_BTC);
+		roam_trigger_parameters->scan_mode =
+			ROAM_TRIGGER_SCAN_MODE_PARTIAL;
+
+		roam_trigger_parameters++;
+	}
+
 	if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap) {
 		wmi_fill_default_roam_trigger_parameters(
 				roam_trigger_parameters,

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

@@ -1594,6 +1594,7 @@ wma_get_trigger_detail_str(struct wmi_roam_trigger_info *roam_info, char *buf)
 	case WMI_ROAM_TRIGGER_REASON_IDLE:
 	case WMI_ROAM_TRIGGER_REASON_FORCED:
 	case WMI_ROAM_TRIGGER_REASON_UNIT_TEST:
+	case WMI_ROAM_TRIGGER_REASON_BTC:
 		return;
 	case WMI_ROAM_TRIGGER_REASON_BTM:
 		buf_cons = qdf_snprint(temp, buf_left,