ソースを参照

qcacld-3.0: Remove wow wake lock overloading

Currently, Host uses single wow_wake-lock for all wow
wakeup events like (auth/assoc/deauth/disassoc etc)
which raise difficulty to detect what is actual cause of
holding wake lock.
As a part of this fix, Add separate multiple wake locks
to remove wake lock overloading.

Change-Id: Iac0a6f73ac05dd3960a4ea0229190cb851808e16
CRs-Fixed: 2046511
Mukul Sharma 8 年 前
コミット
e44d054ec2
4 ファイル変更57 行追加9 行削除
  1. 16 0
      core/wma/inc/wma.h
  2. 7 7
      core/wma/src/wma_features.c
  3. 30 1
      core/wma/src/wma_main.c
  4. 4 1
      core/wma/src/wma_scan_roam.c

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

@@ -328,6 +328,8 @@ enum ds_mode {
 #define WMA_ROAM_HO_WAKE_LOCK_DURATION          (500)          /* in msec */
 #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
 #define WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION    (5 * 1000)     /* in msec */
+#else
+#define WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION    0              /* in msec */
 #endif
 #define WMA_BMISS_EVENT_WAKE_LOCK_DURATION      (4 * 1000)     /* in msec */
 #define WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION     (3 * 1000)     /* in msec */
@@ -1281,6 +1283,13 @@ struct hw_mode_idx_to_mac_cap_idx {
  * @pno_wake_lock: PNO wake lock
  * @extscan_wake_lock: extscan wake lock
  * @wow_wake_lock: wow wake lock
+ * @wow_auth_req_wl: wow wake lock for auth req
+ * @wow_assoc_req_wl: wow wake lock for assoc req
+ * @wow_deauth_rec_wl: wow wake lock for deauth req
+ * @wow_disassoc_rec_wl: wow wake lock for disassoc req
+ * @wow_ap_assoc_lost_wl: wow wake lock for assoc lost req
+ * @wow_auto_shutdown_wl: wow wake lock for shutdown req
+ * @roam_ho_wl: wake lock for roam handoff req
  * @wow_nack: wow negative ack flag
  * @ap_client_cnt: ap client count
  * @is_wow_bus_suspended: is wow bus suspended flag
@@ -1442,6 +1451,13 @@ typedef struct {
 	qdf_wake_lock_t extscan_wake_lock;
 #endif
 	qdf_wake_lock_t wow_wake_lock;
+	qdf_wake_lock_t wow_auth_req_wl;
+	qdf_wake_lock_t wow_assoc_req_wl;
+	qdf_wake_lock_t wow_deauth_rec_wl;
+	qdf_wake_lock_t wow_disassoc_rec_wl;
+	qdf_wake_lock_t wow_ap_assoc_lost_wl;
+	qdf_wake_lock_t wow_auto_shutdown_wl;
+	qdf_wake_lock_t roam_ho_wl;
 	int wow_nack;
 	qdf_atomic_t is_wow_bus_suspended;
 	qdf_mc_timer_t wma_scan_comp_timer;

+ 7 - 7
core/wma/src/wma_features.c

@@ -2207,33 +2207,33 @@ static void wma_acquire_wow_wakelock(t_wma_handle *wma, int wake_reason)
 
 	switch (wake_reason) {
 	case WOW_REASON_AUTH_REQ_RECV:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_auth_req_wl;
 		ms = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT;
 		break;
 	case WOW_REASON_ASSOC_REQ_RECV:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_assoc_req_wl;
 		ms = WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION;
 		break;
 	case WOW_REASON_DEAUTH_RECVD:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_deauth_rec_wl;
 		ms = WMA_DEAUTH_RECV_WAKE_LOCK_DURATION;
 		break;
 	case WOW_REASON_DISASSOC_RECVD:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_disassoc_rec_wl;
 		ms = WMA_DISASSOC_RECV_WAKE_LOCK_DURATION;
 		break;
 	case WOW_REASON_AP_ASSOC_LOST:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_ap_assoc_lost_wl;
 		ms = WMA_BMISS_EVENT_WAKE_LOCK_DURATION;
 		break;
 #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
 	case WOW_REASON_HOST_AUTO_SHUTDOWN:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->wow_auto_shutdown_wl;
 		ms = WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION;
 		break;
 #endif
 	case WOW_REASON_ROAM_HO:
-		wl = &wma->wow_wake_lock;
+		wl = &wma->roam_ho_wl;
 		ms = WMA_ROAM_HO_WAKE_LOCK_DURATION;
 		break;
 	default:

+ 30 - 1
core/wma/src/wma_main.c

@@ -2148,7 +2148,22 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, void *cds_context,
 		qdf_wake_lock_create(&wma_handle->extscan_wake_lock,
 					"wlan_extscan_wl");
 #endif /* FEATURE_WLAN_EXTSCAN */
-		qdf_wake_lock_create(&wma_handle->wow_wake_lock, "wlan_wow_wl");
+		qdf_wake_lock_create(&wma_handle->wow_wake_lock,
+			"wlan_wow_wl");
+		qdf_wake_lock_create(&wma_handle->wow_auth_req_wl,
+			"wlan_auth_req_wl");
+		qdf_wake_lock_create(&wma_handle->wow_assoc_req_wl,
+			"wlan_assoc_req_wl");
+		qdf_wake_lock_create(&wma_handle->wow_deauth_rec_wl,
+			"wlan_deauth_rec_wl");
+		qdf_wake_lock_create(&wma_handle->wow_disassoc_rec_wl,
+			"wlan_disassoc_rec_wl");
+		qdf_wake_lock_create(&wma_handle->wow_ap_assoc_lost_wl,
+			"wlan_ap_assoc_lost_wl");
+		qdf_wake_lock_create(&wma_handle->wow_auto_shutdown_wl,
+			"wlan_auto_shutdown_wl");
+		qdf_wake_lock_create(&wma_handle->roam_ho_wl,
+			"wlan_roam_ho_wl");
 	}
 
 	qdf_status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_LEGACY_WMA_ID);
@@ -2606,6 +2621,13 @@ err_wma_handle:
 		qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
 #endif /* FEATURE_WLAN_EXTSCAN */
 		qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
+		qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
+		qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
 	}
 
 	cds_free_context(cds_context, QDF_MODULE_ID_WMA, wma_handle);
@@ -3565,6 +3587,13 @@ QDF_STATUS wma_close(void *cds_ctx)
 		qdf_wake_lock_destroy(&wma_handle->extscan_wake_lock);
 #endif /* FEATURE_WLAN_EXTSCAN */
 		qdf_wake_lock_destroy(&wma_handle->wow_wake_lock);
+		qdf_wake_lock_destroy(&wma_handle->wow_auth_req_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_assoc_req_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_deauth_rec_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_disassoc_rec_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_ap_assoc_lost_wl);
+		qdf_wake_lock_destroy(&wma_handle->wow_auto_shutdown_wl);
+		qdf_wake_lock_destroy(&wma_handle->roam_ho_wl);
 	}
 
 	/* unregister Firmware debug log */

+ 4 - 1
core/wma/src/wma_scan_roam.c

@@ -2342,7 +2342,10 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
 	}
 	WMA_LOGE("LFR3: Received WMA_ROAM_OFFLOAD_SYNCH_IND");
 
-	qdf_wake_lock_timeout_acquire(&wma->wow_wake_lock,
+	cds_host_diag_log_work(&wma->roam_ho_wl,
+			       WMA_ROAM_HO_WAKE_LOCK_DURATION,
+			       WIFI_POWER_EVENT_WAKELOCK_WOW);
+	qdf_wake_lock_timeout_acquire(&wma->roam_ho_wl,
 				      WMA_ROAM_HO_WAKE_LOCK_DURATION);
 
 	wma->interfaces[synch_event->vdev_id].roam_synch_in_progress = true;