Browse Source

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
Rajeev Kumar 7 years ago
parent
commit
155a3e4a88
3 changed files with 29 additions and 1 deletions
  1. 3 0
      core/wma/inc/wma.h
  2. 2 0
      core/wma/src/wma_main.c
  3. 24 1
      core/wma/src/wma_mgmt.c

+ 3 - 0
core/wma/inc/wma.h

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

+ 2 - 0
core/wma/src/wma_main.c

@@ -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);
 }
 
 /**

+ 24 - 1
core/wma/src/wma_mgmt.c

@@ -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;
 }