Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7bd4328 authored by gaurank kathpalia's avatar gaurank kathpalia Committed by nshrivas
Browse files

qcacld-3.0: Set power save enable directly to FW

Currently, the driver schedules the message to set
power save enable/disable to FW as part of the
set power mgmt command received from the userspace.
This command is then scheduled and is sent via
the scheduler thread.
Generally, userspace sets the power save disable
when it starts the DHCP process and enables the
power save back when the DHCP is completed.
DHCP packets are sent through the Datapath and the
PS enable/disable command would be sent via the
control path explained above.
the Race could happen that the scheduler was busy
with some other task and the PS disable command
was in the queue and the DHCP process began.
This would result in DHCP packets going to the peer
with PS enabled.

The fix is to set the power save enable/disable directly
instead of using the scheduler path.

Change-Id: I0f2aed37f875c283f318fb44bcc40d0ab401413a
CRs-Fixed: 2611480
parent 1aa22599
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -402,8 +402,6 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
		CASE_RETURN_STRING(WMA_CHNL_SWITCH_REQ);
		CASE_RETURN_STRING(WMA_ADD_TS_REQ);
		CASE_RETURN_STRING(WMA_DEL_TS_REQ);
		CASE_RETURN_STRING(WMA_EXIT_PS_REQ);
		CASE_RETURN_STRING(WMA_ENTER_PS_REQ);
		CASE_RETURN_STRING(WMA_MISSED_BEACON_IND);

		CASE_RETURN_STRING(WMA_SWITCH_CHANNEL_RSP);
+16 −28
Original line number Diff line number Diff line
@@ -138,13 +138,12 @@ static void sme_get_ps_state(struct mac_context *mac_ctx,
 *
 * Return: QDF_STATUS
 */
static QDF_STATUS sme_ps_enable_ps_req_params(struct mac_context *mac_ctx,
		uint32_t session_id)
static QDF_STATUS
sme_ps_enable_ps_req_params(struct mac_context *mac_ctx, uint32_t vdev_id)
{
	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];
	struct ps_params *ps_param = &ps_global_info->ps_params[vdev_id];
	enum ps_state ps_state;

	enable_ps_req_params =  qdf_mem_malloc(sizeof(*enable_ps_req_params));
@@ -155,21 +154,20 @@ static QDF_STATUS sme_ps_enable_ps_req_params(struct mac_context *mac_ctx,
		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);
				vdev_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;
	enable_ps_req_params->sessionid = vdev_id;

	status = sme_post_ps_msg_to_wma(WMA_ENTER_PS_REQ, enable_ps_req_params);
	if (!QDF_IS_STATUS_SUCCESS(status))
		return QDF_STATUS_E_FAILURE;
	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
		FL("Message WMA_ENTER_PS_REQ Successfully sent to WMA"));
	wma_enable_sta_ps_mode(enable_ps_req_params);

	sme_debug("Powersave Enable sent to FW");
	ps_param->ps_state = ps_state;

	return QDF_STATUS_SUCCESS;
}

@@ -181,24 +179,21 @@ static QDF_STATUS sme_ps_enable_ps_req_params(struct mac_context *mac_ctx,
 * Return: QDF_STATUS
 */
static QDF_STATUS sme_ps_disable_ps_req_params(struct mac_context *mac_ctx,
		uint32_t session_id)
					       uint32_t vdev_id)
{
	struct  sDisablePsParams *disable_ps_req_params;
	QDF_STATUS status = QDF_STATUS_SUCCESS;

	disable_ps_req_params = qdf_mem_malloc(sizeof(*disable_ps_req_params));
	if (!disable_ps_req_params)
		return QDF_STATUS_E_NOMEM;

	disable_ps_req_params->psSetting = eSIR_ADDON_NOTHING;
	disable_ps_req_params->sessionid = session_id;
	disable_ps_req_params->sessionid = vdev_id;

	wma_disable_sta_ps_mode(disable_ps_req_params);
	sme_debug("Powersave disable sent to FW");
	sme_set_ps_state(mac_ctx, vdev_id, FULL_POWER_MODE);

	status = sme_post_ps_msg_to_wma(WMA_EXIT_PS_REQ, disable_ps_req_params);
	if (!QDF_IS_STATUS_SUCCESS(status))
		return QDF_STATUS_E_FAILURE;
	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
			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;
}

@@ -411,7 +406,6 @@ QDF_STATUS sme_ps_timer_flush_sync(mac_handle_t mac_handle, uint8_t session_id)
	enum ps_state ps_state;
	QDF_TIMER_STATE tstate;
	struct sEnablePsParams *req;
	t_wma_handle *wma;

	QDF_BUG(session_id < WLAN_MAX_VDEVS);
	if (session_id >= WLAN_MAX_VDEVS)
@@ -432,12 +426,6 @@ QDF_STATUS sme_ps_timer_flush_sync(mac_handle_t mac_handle, uint8_t session_id)

	qdf_mc_timer_stop(&ps_parm->auto_ps_enable_timer);

	wma = cds_get_context(QDF_MODULE_ID_WMA);
	if (!wma) {
		sme_err("wma is null");
		return QDF_STATUS_E_INVAL;
	}

	req = qdf_mem_malloc(sizeof(*req));
	if (!req)
		return QDF_STATUS_E_NOMEM;
@@ -454,7 +442,7 @@ QDF_STATUS sme_ps_timer_flush_sync(mac_handle_t mac_handle, uint8_t session_id)
	}
	req->sessionid = session_id;

	wma_enable_sta_ps_mode(wma, req);
	wma_enable_sta_ps_mode(req);
	qdf_mem_free(req);

	ps_parm->ps_state = ps_state;
+2 −3
Original line number Diff line number Diff line
@@ -1034,12 +1034,11 @@ void wma_process_update_userpos(tp_wma_handle wma_handle,

/**
 * wma_enable_sta_ps_mode() - enable sta powersave params in fw
 * @wma: wma handle
 * @ps_req: power save request
 *
 * Return: none
 */
void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req);
void wma_enable_sta_ps_mode(tpEnablePsParams ps_req);

QDF_STATUS wma_unified_set_sta_ps_param(wmi_unified_t wmi_handle,
					    uint32_t vdev_id, uint32_t param,
@@ -1059,7 +1058,7 @@ void wma_set_tx_power(WMA_HANDLE handle,
void wma_set_max_tx_power(WMA_HANDLE handle,
				 tMaxTxPowerParams *tx_pwr_params);

void wma_disable_sta_ps_mode(tp_wma_handle wma, tpDisablePsParams ps_req);
void wma_disable_sta_ps_mode(tpDisablePsParams ps_req);

/**
 * wma_enable_uapsd_mode() - enable uapsd mode in fw
+0 −3
Original line number Diff line number Diff line
@@ -140,9 +140,6 @@

#define WMA_MISSED_BEACON_IND          SIR_HAL_MISSED_BEACON_IND

#define WMA_ENTER_PS_REQ               SIR_HAL_ENTER_PS_REQ
#define WMA_EXIT_PS_REQ                SIR_HAL_EXIT_PS_REQ

#define WMA_HIDDEN_SSID_RESTART_RSP    SIR_HAL_HIDDEN_SSID_RESTART_RSP
#define WMA_SWITCH_CHANNEL_RSP         SIR_HAL_SWITCH_CHANNEL_RSP
#define WMA_P2P_NOA_ATTR_IND           SIR_HAL_P2P_NOA_ATTR_IND
+0 −10
Original line number Diff line number Diff line
@@ -8319,16 +8319,6 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
		qdf_mem_free(msg->bodyptr);
		break;
#endif /* REMOVE_PKT_LOG */
	case WMA_ENTER_PS_REQ:
		wma_enable_sta_ps_mode(wma_handle,
				       (tpEnablePsParams) msg->bodyptr);
		qdf_mem_free(msg->bodyptr);
		break;
	case WMA_EXIT_PS_REQ:
		wma_disable_sta_ps_mode(wma_handle,
					(tpDisablePsParams) msg->bodyptr);
		qdf_mem_free(msg->bodyptr);
		break;
	case WMA_ENABLE_UAPSD_REQ:
		wma_enable_uapsd_mode(wma_handle,
				      (tpEnableUapsdParams) msg->bodyptr);
Loading