qcacld-3.0: Add 1 second timed wake lock for 4 way handshake

Add 1 second wake lock for 4 way handshake to avoid APPS
power collapse in middle of eapol exchange which can delay
the association process.

Change-Id: Ife73dc00aa05b5a80d0a90afd18468bd033ebdd9
CRs-Fixed: 2118533
This commit is contained in:
Rajeev Kumar 2017-10-10 15:31:17 -07:00 • committed by Nandini Suresh
commit 155a3e4a88
3 changed files with 29 additions and 1 deletions

View file

@ -292,6 +292,7 @@ enum ds_mode {
#define WMA_VDEV_STOP_REQUEST_TIMEOUT (6000) /* 6 seconds */
#define WMA_VDEV_HW_MODE_REQUEST_TIMEOUT (5000) /* 5 seconds */
#define WMA_VDEV_PLCY_MGR_CMD_TIMEOUT (3000) /* 3 seconds */
#define WMA_VDEV_SET_KEY_REQUEST_TIMEOUT (1000) /* 1 second */
#define WMA_TGT_INVALID_SNR (0)
@ -1043,6 +1044,7 @@ typedef struct {
* @in_bmps : Whether bmps for this interface has been enabled
* @vdev_start_wakelock: wakelock to protect vdev start op with firmware
* @vdev_stop_wakelock: wakelock to protect vdev stop op with firmware
* @vdev_set_key_wakelock: wakelock to protect vdev set key op with firmware
*/
struct wma_txrx_node {
uint8_t addr[IEEE80211_ADDR_LEN];
@ -1127,6 +1129,7 @@ struct wma_txrx_node {
bool beacon_filter_enabled;
qdf_wake_lock_t vdev_start_wakelock;
qdf_wake_lock_t vdev_stop_wakelock;
qdf_wake_lock_t vdev_set_key_wakelock;
};
#if defined(QCA_WIFI_FTM)

View file

@ -2356,12 +2356,14 @@ void wma_vdev_init(struct wma_txrx_node *vdev)
{
qdf_wake_lock_create(&vdev->vdev_start_wakelock, "vdev_start");
qdf_wake_lock_create(&vdev->vdev_stop_wakelock, "vdev_stop");
qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
}
void wma_vdev_deinit(struct wma_txrx_node *vdev)
{
qdf_wake_lock_destroy(&vdev->vdev_start_wakelock);
qdf_wake_lock_destroy(&vdev->vdev_stop_wakelock);
qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
}
/**

View file

@ -1240,8 +1240,13 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
#ifdef FEATURE_WLAN_WAPI
|| params->encryptType == eSIR_ED_WPI
#endif /* FEATURE_WLAN_WAPI */
)
) {
cmd->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
WMA_LOGD("Acquire set key wake lock for %d ms",
WMA_VDEV_SET_KEY_REQUEST_TIMEOUT);
wma_acquire_wakelock(&intr->vdev_set_key_wakelock,
WMA_VDEV_SET_KEY_REQUEST_TIMEOUT);
}
if (params->wpa_rsn >> 1)
cmd->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
@ -1630,6 +1635,17 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
return QDF_STATUS_E_NOMEM;
}
if (NULL == wma_handle) {
WMA_LOGE(FL("Invalid wma_handle for vdev_id: %d"),
key_params->vdev_id);
return QDF_STATUS_E_INVAL;
}
if (key_params->vdev_id >= wma_handle->max_bssid) {
WMA_LOGE(FL("Invalid vdev_id: %d"), key_params->vdev_id);
return QDF_STATUS_E_INVAL;
}
iface = &wma_handle->interfaces[key_params->vdev_id];
params.vdev_id = key_params->vdev_id;
params.key_idx = key_params->key_idx;
qdf_mem_copy(params.peer_mac, key_params->peer_mac, IEEE80211_ADDR_LEN);
@ -1779,6 +1795,13 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
status = wmi_unified_setup_install_key_cmd(wma_handle->wmi_handle,
&params);
if (!key_params->unicast) {
/* Its GTK release the wake lock */
WMA_LOGD("Release set key wake lock");
wma_release_wakelock(&iface->vdev_set_key_wakelock);
}
return status;
}