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
Esse commit está contido em:
Surabhi Vishnoi
2022-02-03 17:48:59 +05:30
commit de Madan Koyyalamudi
commit e8894805e6

Ver arquivo

@@ -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) {