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

Commit 8dad2db3 authored by Mohammed Siddiq's avatar Mohammed Siddiq
Browse files

icnss2: Add code to send exit power save over qmi



Add code to send exit power save over qmi during
wow exit.

Change-Id: I926e85c17e16341446e56d8145de7333ac332aab
Signed-off-by: default avatarMohammed Siddiq <msiddiq@codeaurora.org>
parent 4e1c68c5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -2763,6 +2763,14 @@ static int icnss_pm_resume(struct device *dev)
	    !test_bit(ICNSS_DRIVER_PROBED, &priv->state))
		goto out;

	if (priv->device_id == WCN6750_DEVICE_ID) {
		ret = wlfw_exit_power_save_send_msg(priv);
		if (ret) {
			priv->stats.pm_resume_err++;
			return ret;
		}
	}

	ret = priv->ops->pm_resume(dev);

out:
+3 −0
Original line number Diff line number Diff line
@@ -207,6 +207,9 @@ struct icnss_stats {
	uint32_t device_info_req;
	uint32_t device_info_resp;
	uint32_t device_info_err;
	u32 exit_power_save_req;
	u32 exit_power_save_resp;
	u32 exit_power_save_err;
};

#define WLFW_MAX_TIMESTAMP_LEN 32
+73 −0
Original line number Diff line number Diff line
@@ -340,6 +340,79 @@ int wlfw_device_info_send_msg(struct icnss_priv *priv)
	return ret;
}

int wlfw_exit_power_save_send_msg(struct icnss_priv *priv)
{
	int ret;
	struct wlfw_exit_power_save_req_msg_v01 *req;
	struct wlfw_exit_power_save_resp_msg_v01 *resp;
	struct qmi_txn txn;

	if (!priv)
		return -ENODEV;

	if (test_bit(ICNSS_FW_DOWN, &priv->state))
		return -EINVAL;

	icnss_pr_dbg("Sending exit power save, state: 0x%lx\n",
		     priv->state);

	req = kzalloc(sizeof(*req), GFP_KERNEL);
	if (!req)
		return -ENOMEM;

	resp = kzalloc(sizeof(*resp), GFP_KERNEL);
	if (!resp) {
		kfree(req);
		return -ENOMEM;
	}

	priv->stats.exit_power_save_req++;

	ret = qmi_txn_init(&priv->qmi, &txn,
			   wlfw_exit_power_save_resp_msg_v01_ei, resp);
	if (ret < 0) {
		icnss_qmi_fatal_err("Fail to init txn for exit power save%d\n",
				    ret);
		goto out;
	}

	ret = qmi_send_request(&priv->qmi, NULL, &txn,
			       QMI_WLFW_EXIT_POWER_SAVE_REQ_V01,
			       WLFW_EXIT_POWER_SAVE_REQ_MSG_V01_MAX_MSG_LEN,
			       wlfw_exit_power_save_req_msg_v01_ei, req);
	if (ret < 0) {
		qmi_txn_cancel(&txn);
		icnss_qmi_fatal_err("Fail to send exit power save req %d\n",
				    ret);
		goto out;
	}

	ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout);
	if (ret < 0) {
		icnss_qmi_fatal_err("Exit power save wait failed with ret %d\n",
				    ret);
		goto out;
	} else if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
		icnss_qmi_fatal_err(
		    "QMI exit power save request rejected,result:%d error:%d\n",
				    resp->resp.result, resp->resp.error);
		ret = -resp->resp.result;
		goto out;
	}

	priv->stats.exit_power_save_resp++;

	kfree(resp);
	kfree(req);
	return 0;

out:
	kfree(resp);
	kfree(req);
	priv->stats.exit_power_save_err++;
	return ret;
}

int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv)
{
	int ret;
+6 −0
Original line number Diff line number Diff line
@@ -128,6 +128,11 @@ int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv)
{
	return 0;
}

int wlfw_exit_power_save_send_msg(struct icnss_priv *priv)
{
	return 0;
}
#else
int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv);
int icnss_connect_to_fw_server(struct icnss_priv *priv, void *data);
@@ -163,6 +168,7 @@ int wlfw_wlan_mode_send_sync_msg(struct icnss_priv *priv,
				 enum wlfw_driver_mode_enum_v01 mode);
int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type);
int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv);
int wlfw_exit_power_save_send_msg(struct icnss_priv *priv);
#endif

#endif /* __ICNSS_QMI_H__*/