summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/wma/inc/wma.h3
-rw-r--r--core/wma/src/wma_main.c2
-rw-r--r--core/wma/src/wma_mgmt.c25
3 files changed, 29 insertions, 1 deletions
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h
index e4ed8816b508..19e485fd0955 100644
--- a/core/wma/inc/wma.h
+++ b/core/wma/inc/wma.h
@@ -294,6 +294,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)
@@ -1063,6 +1064,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];
@@ -1150,6 +1152,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)
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index f4684f474c7e..0ebc79097db2 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -2210,12 +2210,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);
}
/**
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index de01b191bc8b..df5d7d889bae 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -1232,8 +1232,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;
@@ -1571,6 +1576,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);
@@ -1720,6 +1736,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;
}