Browse Source

qcacld-3.0: Optimise the roam time latency

This change optimises the time to enable the TX queues during
connection/roaming by deferring the oem response to userspace and
roam_auth event to wpa_supplicant.

Change-ID: I1724022de3b87482e4e4a35efac358de9f6a367d
CRs-Fixed: 3119070
Surabhi Vishnoi 3 years ago
parent
commit
e8894805e6
1 changed files with 37 additions and 56 deletions
  1. 37 56
      core/hdd/src/wlan_hdd_cm_connect.c

+ 37 - 56
core/hdd/src/wlan_hdd_cm_connect.c

@@ -1095,6 +1095,7 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 	bool is_roam_offload = false;
 	bool is_roam = rsp->is_reassoc;
 	ol_txrx_soc_handle soc = cds_get_context(QDF_MODULE_ID_SOC);
+	uint8_t uapsd_mask = 0;
 	uint32_t phymode;
 	uint32_t time_buffer_size;
 
@@ -1162,19 +1163,6 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 	 * hdd_send_ft_assoc_response,
 	 */
 
-	/* send peer status indication to oem app */
-	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
-							  WLAN_UMAC_COMP_MLME);
-	if (vdev_mlme) {
-		hdd_send_peer_status_ind_to_app(
-			&rsp->bssid,
-			ePeerConnected,
-			vdev_mlme->ext_vdev_ptr->connect_info.timing_meas_cap,
-			adapter->vdev_id,
-			&vdev_mlme->ext_vdev_ptr->connect_info.chan_info,
-			adapter->device_mode);
-	}
-
 	hdd_ipa_set_tx_flow_info();
 	hdd_place_marker(adapter, "ASSOCIATION COMPLETE", NULL);
 
@@ -1211,6 +1199,16 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 		adapter->is_link_up_service_needed = false;
 	}
 
+	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
+							  WLAN_UMAC_COMP_MLME);
+	if (vdev_mlme)
+		uapsd_mask =
+			vdev_mlme->ext_vdev_ptr->connect_info.uapsd_per_ac_bitmask;
+
+	cdp_hl_fc_set_td_limit(soc, adapter->vdev_id,
+			       sta_ctx->conn_info.chan_freq);
+	hdd_wmm_assoc(adapter, false, uapsd_mask);
+
 	if (!rsp->is_wps_connection &&
 	    (sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_NONE ||
 	     sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM ||
@@ -1222,9 +1220,32 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 		/* If roaming is set check if FW roaming/LFR3  */
 		ucfg_mlme_get_roaming_offload(hdd_ctx->psoc, &is_roam_offload);
 
-	if (is_roam_offload)
+	if (is_roam_offload || !is_roam) {
+		/* For FW_ROAM/LFR3 OR connect */
 		/* for LFR 3 get authenticated info from resp */
-		is_auth_required = hdd_cm_is_roam_auth_required(sta_ctx, rsp);
+		if (is_roam)
+			is_auth_required =
+				hdd_cm_is_roam_auth_required(sta_ctx, rsp);
+		hdd_roam_register_sta(adapter, &rsp->bssid, is_auth_required);
+	} else {
+		/* for host roam/LFR2 */
+		hdd_cm_set_peer_authenticate(adapter, &rsp->bssid,
+					     is_auth_required);
+	}
+
+	hdd_debug("Enabling queues");
+	hdd_cm_netif_queue_enable(adapter);
+
+	/* send peer status indication to oem app */
+	if (vdev_mlme) {
+		hdd_send_peer_status_ind_to_app(
+			&rsp->bssid,
+			ePeerConnected,
+			vdev_mlme->ext_vdev_ptr->connect_info.timing_meas_cap,
+			adapter->vdev_id,
+			&vdev_mlme->ext_vdev_ptr->connect_info.chan_info,
+			adapter->device_mode);
+	}
 
 	if (ucfg_ipa_is_enabled() && !is_auth_required)
 		ucfg_ipa_wlan_evt(hdd_ctx->pdev, adapter->dev,
@@ -1256,12 +1277,6 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 {
 	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
 	struct hdd_adapter *adapter;
-	struct hdd_station_ctx *sta_ctx;
-	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct vdev_mlme_obj *mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
-	uint8_t uapsd_mask = 0;
-	bool is_auth_required = true;
-	bool is_roam_offload = false;
 	bool is_roam = rsp->is_reassoc;
 
 	if (!hdd_ctx) {
@@ -1275,46 +1290,12 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 		return;
 	}
 
-	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
-	if (mlme_obj)
-		uapsd_mask =
-			mlme_obj->ext_vdev_ptr->connect_info.uapsd_per_ac_bitmask;
-	if (is_roam) {
-		/* If roaming is set check if FW roaming/LFR3  */
-		ucfg_mlme_get_roaming_offload(hdd_ctx->psoc, &is_roam_offload);
-	} else {
+	if (!is_roam) {
 		/* call only for connect */
 		qdf_runtime_pm_allow_suspend(&hdd_ctx->runtime_context.connect);
 		hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_CONNECT);
 	}
 
-	cdp_hl_fc_set_td_limit(soc, adapter->vdev_id,
-			       sta_ctx->conn_info.chan_freq);
-	hdd_wmm_assoc(adapter, false, uapsd_mask);
-
-	if (!rsp->is_wps_connection &&
-	    (sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_NONE ||
-	     sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM ||
-	     sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_SHARED_KEY ||
-	     hdd_cm_is_fils_connection(rsp)))
-		is_auth_required = false;
-
-	if (is_roam_offload || !is_roam) {
-		/* For FW_ROAM/LFR3 OR connect */
-		/* for LFR 3 get authenticated info from resp */
-		if (is_roam)
-			is_auth_required =
-				hdd_cm_is_roam_auth_required(sta_ctx, rsp);
-		hdd_roam_register_sta(adapter, &rsp->bssid, is_auth_required);
-	} else {
-		/* for host roam/LFR2 */
-		hdd_cm_set_peer_authenticate(adapter, &rsp->bssid,
-					     is_auth_required);
-	}
-
-	hdd_debug("Enabling queues");
-	hdd_cm_netif_queue_enable(adapter);
-
 	hdd_cm_clear_pmf_stats(adapter);
 
 	if (adapter->device_mode == QDF_STA_MODE) {