Pārlūkot izejas kodu

qcacld-3.0: Enable UAPSD only when device is in power save

Send UAPSD parameters to FW and enable it only if the device is
in power save mode.

Change-Id: I14ecfc8bace7ec15eebe18296355544cdbdf030e
CRs-Fixed: 991119
Kiran Kumar Lokere 9 gadi atpakaļ
vecāks
revīzija
830ba16663
3 mainītis faili ar 118 papildinājumiem un 52 dzēšanām
  1. 101 40
      core/sme/src/common/sme_power_save.c
  2. 4 3
      core/wma/inc/wma_types.h
  3. 13 9
      core/wma/src/wma_power.c

+ 101 - 40
core/sme/src/common/sme_power_save.c

@@ -62,6 +62,78 @@ QDF_STATUS sme_post_ps_msg_to_wma(uint16_t type, void *body)
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * sme_ps_enable_uapsd_req_params(): enables UASPD req params
+ * @mac_ctx: global mac context
+ * @session_id: session id
+ *
+ * Return: QDF_STATUS
+ */
+static void sme_ps_fill_uapsd_req_params(tpAniSirGlobal mac_ctx,
+		tUapsd_Params *uapsdParams, uint32_t session_id,
+		enum ps_state *ps_state)
+{
+
+	uint8_t uapsd_delivery_mask = 0;
+	uint8_t uapsd_trigger_mask = 0;
+	struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
+	struct ps_params *ps_param = &ps_global_info->ps_params[session_id];
+
+	uapsd_delivery_mask =
+		ps_param->uapsd_per_ac_bit_mask |
+		ps_param->uapsd_per_ac_delivery_enable_mask;
+
+	uapsd_trigger_mask =
+		ps_param->uapsd_per_ac_bit_mask |
+		ps_param->uapsd_per_ac_trigger_enable_mask;
+
+	uapsdParams->bkDeliveryEnabled =
+		LIM_UAPSD_GET(ACBK, uapsd_delivery_mask);
+
+	uapsdParams->beDeliveryEnabled =
+		LIM_UAPSD_GET(ACBE, uapsd_delivery_mask);
+
+	uapsdParams->viDeliveryEnabled =
+		LIM_UAPSD_GET(ACVI, uapsd_delivery_mask);
+
+	uapsdParams->voDeliveryEnabled =
+		LIM_UAPSD_GET(ACVO, uapsd_delivery_mask);
+
+	uapsdParams->bkTriggerEnabled =
+		LIM_UAPSD_GET(ACBK, uapsd_trigger_mask);
+
+	uapsdParams->beTriggerEnabled =
+		LIM_UAPSD_GET(ACBE, uapsd_trigger_mask);
+
+	uapsdParams->viTriggerEnabled =
+		LIM_UAPSD_GET(ACVI, uapsd_trigger_mask);
+
+	uapsdParams->voTriggerEnabled =
+		LIM_UAPSD_GET(ACVO, uapsd_trigger_mask);
+	if (ps_param->ps_state != FULL_POWER_MODE) {
+		uapsdParams->enable_ps = true;
+		*ps_state = UAPSD_MODE;
+	} else {
+		uapsdParams->enable_ps = false;
+		*ps_state = FULL_POWER_MODE;
+	}
+}
+
+static void sme_set_ps_state(tpAniSirGlobal mac_ctx,
+		uint32_t session_id, enum ps_state ps_state)
+{
+	struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
+	struct ps_params *ps_param = &ps_global_info->ps_params[session_id];
+	ps_param->ps_state = ps_state;
+}
+
+static void sme_get_ps_state(tpAniSirGlobal mac_ctx,
+		uint32_t session_id, enum ps_state *ps_state)
+{
+	struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
+	struct ps_params *ps_param = &ps_global_info->ps_params[session_id];
+	*ps_state = ps_param->ps_state;
+}
 /**
  * sme_ps_enable_ps_req_params(): enables power save req params
  * @mac_ctx: global mac context
@@ -74,6 +146,9 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx,
 {
 	struct sEnablePsParams *enable_ps_req_params;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
+	struct ps_params *ps_param = &ps_global_info->ps_params[session_id];
+	enum ps_state ps_state;
 
 	enable_ps_req_params =  qdf_mem_malloc(sizeof(*enable_ps_req_params));
 	if (NULL == enable_ps_req_params) {
@@ -81,7 +156,17 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx,
 			FL("Memory allocation failed for enable_ps_req_params"));
 		return QDF_STATUS_E_NOMEM;
 	}
-	enable_ps_req_params->psSetting = eSIR_ADDON_NOTHING;
+	if (ps_param->uapsd_per_ac_bit_mask) {
+		enable_ps_req_params->psSetting = eSIR_ADDON_ENABLE_UAPSD;
+		sme_ps_fill_uapsd_req_params(mac_ctx,
+				&enable_ps_req_params->uapsdParams,
+				session_id, &ps_state);
+		ps_state = UAPSD_MODE;
+		enable_ps_req_params->uapsdParams.enable_ps = true;
+	} else {
+		enable_ps_req_params->psSetting = eSIR_ADDON_NOTHING;
+		ps_state = LEGACY_POWER_SAVE_MODE;
+	}
 	enable_ps_req_params->sessionid = session_id;
 
 	status = sme_post_ps_msg_to_wma(WMA_ENTER_PS_REQ, enable_ps_req_params);
@@ -89,6 +174,7 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx,
 		return QDF_STATUS_E_FAILURE;
 	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
 		FL("Message WMA_ENTER_PS_REQ Successfully sent to WMA"));
+	ps_param->ps_state = ps_state;
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -120,6 +206,7 @@ QDF_STATUS sme_ps_disable_ps_req_params(tpAniSirGlobal mac_ctx,
 		return QDF_STATUS_E_FAILURE;
 	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
 			FL("Message WMA_EXIT_PS_REQ Successfully sent to WMA"));
+	sme_set_ps_state(mac_ctx, session_id, FULL_POWER_MODE);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -135,11 +222,8 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx,
 {
 
 	struct sEnableUapsdParams *enable_uapsd_req_params;
-	uint8_t uapsd_delivery_mask = 0;
-	uint8_t uapsd_trigger_mask = 0;
-	struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
-	struct ps_params *ps_param = &ps_global_info->ps_params[session_id];
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	enum ps_state ps_state;
 
 	enable_uapsd_req_params =
 		qdf_mem_malloc(sizeof(*enable_uapsd_req_params));
@@ -149,40 +233,9 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx,
 		return QDF_STATUS_E_NOMEM;
 	}
 
-
-	uapsd_delivery_mask =
-		ps_param->uapsd_per_ac_bit_mask |
-		ps_param->uapsd_per_ac_delivery_enable_mask;
-
-	uapsd_trigger_mask =
-		ps_param->uapsd_per_ac_bit_mask |
-		ps_param->uapsd_per_ac_trigger_enable_mask;
-
-
-	enable_uapsd_req_params->uapsdParams.bkDeliveryEnabled =
-		LIM_UAPSD_GET(ACBK, uapsd_delivery_mask);
-
-	enable_uapsd_req_params->uapsdParams.beDeliveryEnabled =
-		LIM_UAPSD_GET(ACBE, uapsd_delivery_mask);
-
-	enable_uapsd_req_params->uapsdParams.viDeliveryEnabled =
-		LIM_UAPSD_GET(ACVI, uapsd_delivery_mask);
-
-	enable_uapsd_req_params->uapsdParams.voDeliveryEnabled =
-		LIM_UAPSD_GET(ACVO, uapsd_delivery_mask);
-
-	enable_uapsd_req_params->uapsdParams.bkTriggerEnabled =
-		LIM_UAPSD_GET(ACBK, uapsd_trigger_mask);
-
-	enable_uapsd_req_params->uapsdParams.beTriggerEnabled =
-		LIM_UAPSD_GET(ACBE, uapsd_trigger_mask);
-
-	enable_uapsd_req_params->uapsdParams.viTriggerEnabled =
-		LIM_UAPSD_GET(ACVI, uapsd_trigger_mask);
-
-	enable_uapsd_req_params->uapsdParams.voTriggerEnabled =
-		LIM_UAPSD_GET(ACVO, uapsd_trigger_mask);
-
+	sme_ps_fill_uapsd_req_params(mac_ctx,
+			&enable_uapsd_req_params->uapsdParams,
+			session_id, &ps_state);
 	enable_uapsd_req_params->sessionid = session_id;
 
 	status = sme_post_ps_msg_to_wma(WMA_ENABLE_UAPSD_REQ,
@@ -192,6 +245,7 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx,
 
 	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
 		    FL("Msg WMA_ENABLE_UAPSD_REQ Successfully sent to WMA"));
+	sme_set_ps_state(mac_ctx, session_id, ps_state);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -207,12 +261,18 @@ QDF_STATUS sme_ps_disable_uapsd_req_params(tpAniSirGlobal mac_ctx,
 {
 	struct sDisableUapsdParams *disable_uapsd_req_params;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	enum ps_state ps_state;
 
+	sme_get_ps_state(mac_ctx, session_id, &ps_state);
+	if (ps_state != UAPSD_MODE) {
+		sms_log(mac_ctx, LOGE, FL("UAPSD is already disabled"));
+		return QDF_STATUS_SUCCESS;
+	}
 	disable_uapsd_req_params =
 		qdf_mem_malloc(sizeof(*disable_uapsd_req_params));
 	if (NULL == disable_uapsd_req_params) {
 		sms_log(mac_ctx, LOGE,
-			FL("Memory allocation failed for disable_uapsd_req_params"));
+			FL("Mem alloc failed for disable_uapsd_req_params"));
 		return QDF_STATUS_E_NOMEM;
 	}
 
@@ -224,6 +284,7 @@ QDF_STATUS sme_ps_disable_uapsd_req_params(tpAniSirGlobal mac_ctx,
 
 	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
 		FL("Message WMA_DISABLE_UAPSD_REQ Successfully sent to WMA"));
+	sme_set_ps_state(mac_ctx, session_id, LEGACY_POWER_SAVE_MODE);
 	return QDF_STATUS_SUCCESS;
 }
 

+ 4 - 3
core/wma/inc/wma_types.h

@@ -526,6 +526,7 @@ typedef struct sUapsd_Params {
 	uint8_t beTriggerEnabled:1;
 	uint8_t viTriggerEnabled:1;
 	uint8_t voTriggerEnabled:1;
+	bool enable_ps;
 } tUapsd_Params, *tpUapsd_Params;
 
 /**
@@ -706,15 +707,15 @@ QDF_STATUS wma_register_roaming_callbacks(void *cds_ctx,
 			roam_offload_synch_ind *roam_synch_data,
 			tpSirBssDescription  bss_desc_ptr));
 #else
-static inline CDF_STATUS wma_register_roaming_callbacks(void *cds_ctx,
+static inline QDF_STATUS wma_register_roaming_callbacks(void *cds_ctx,
 		void (*csr_roam_synch_cb)(tpAniSirGlobal mac,
 			roam_offload_synch_ind *roam_synch_data,
 			tpSirBssDescription  bss_desc_ptr, uint8_t reason),
-		CDF_STATUS (*pe_roam_synch_cb)(tpAniSirGlobal mac,
+		QDF_STATUS (*pe_roam_synch_cb)(tpAniSirGlobal mac,
 			roam_offload_synch_ind *roam_synch_data,
 			tpSirBssDescription  bss_desc_ptr))
 {
-	return CDF_STATUS_E_NOSUPPORT;
+	return QDF_STATUS_E_NOSUPPORT;
 }
 #endif
 

+ 13 - 9
core/wma/src/wma_power.c

@@ -552,7 +552,8 @@ static inline uint32_t wma_get_uapsd_mask(tpUapsd_Params uapsd_params)
 static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 				uint32_t vdev_id,
 				uint8_t enable,
-				enum powersave_qpower_mode qpower_config)
+				enum powersave_qpower_mode qpower_config,
+				bool enable_ps)
 {
 	QDF_STATUS ret;
 	uint32_t cfg_data_val = 0;
@@ -680,11 +681,14 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 		 vdev_id, inactivity_time);
 
 	/* Enable Sta Mode Power save */
-	ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true);
+	if (enable_ps) {
+		ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true);
 
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d", vdev_id);
-		return ret;
+		if (QDF_IS_STATUS_ERROR(ret)) {
+			WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d",
+				vdev_id);
+			return ret;
+		}
 	}
 
 	/* Set Listen Interval */
@@ -886,7 +890,7 @@ void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req)
 		}
 
 		ret = wma_set_force_sleep(wma, vdev_id, false,
-				qpower_config);
+				qpower_config, true);
 		if (QDF_IS_STATUS_ERROR(ret)) {
 			WMA_LOGE("Enable Sta Ps Failed vdevId %d", vdev_id);
 			return;
@@ -916,7 +920,7 @@ void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req)
 
 		WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id);
 		ret = wma_set_force_sleep(wma, vdev_id, true,
-				qpower_config);
+				qpower_config, true);
 
 		if (QDF_IS_STATUS_ERROR(ret)) {
 			WMA_LOGE("Enable Forced Sleep Failed vdevId %d",
@@ -996,7 +1000,7 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
 
 	WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id);
 	ret = wma_set_force_sleep(wma, vdev_id, true,
-			qpower_config);
+			qpower_config, ps_req->uapsdParams.enable_ps);
 	if (QDF_IS_STATUS_ERROR(ret)) {
 		WMA_LOGE("Enable Forced Sleep Failed vdevId %d", vdev_id);
 		return;
@@ -1036,7 +1040,7 @@ void wma_disable_uapsd_mode(tp_wma_handle wma,
 
 	/* Re enable Sta Mode Powersave with proper configuration */
 	ret = wma_set_force_sleep(wma, vdev_id, false,
-			qpower_config);
+			qpower_config, true);
 	if (QDF_IS_STATUS_ERROR(ret)) {
 		WMA_LOGE("Disable Forced Sleep Failed vdevId %d", vdev_id);
 		return;