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

Commit 14961ab5 authored by Sandeep Singh's avatar Sandeep Singh Committed by Gerrit - the friendly Code Review server
Browse files

icnss: Add support for graceful shutdown



Add a QMI command to indicate graceful shutdown to the FW
and updating the QMI file.

Change-Id: I0360f6f5b49bc19ea4a7acbbd0e192e1596463d6
Signed-off-by: default avatarSandeep Singh <sandsing@codeaurora.org>
parent d7807eff
Loading
Loading
Loading
Loading
+58 −1
Original line number Diff line number Diff line
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -1636,6 +1636,56 @@ out:
	return ret;
}

static int wlfw_send_modem_shutdown_msg(void)
{
	int ret;
	struct wlfw_shutdown_req_msg_v01 req;
	struct wlfw_shutdown_resp_msg_v01 resp;
	struct msg_desc req_desc, resp_desc;

	if (!penv || !penv->wlfw_clnt)
		return -ENODEV;

	icnss_pr_dbg("Sending modem shutdown request, state: 0x%lx\n",
		     penv->state);

	memset(&req, 0, sizeof(req));
	memset(&resp, 0, sizeof(resp));

	req.shutdown_valid = 1;
	req.shutdown = 1;

	req_desc.max_msg_len = WLFW_SHUTDOWN_REQ_MSG_V01_MAX_MSG_LEN;
	req_desc.msg_id = QMI_WLFW_SHUTDOWN_REQ_V01;
	req_desc.ei_array = wlfw_shutdown_req_msg_v01_ei;

	resp_desc.max_msg_len = WLFW_SHUTDOWN_RESP_MSG_V01_MAX_MSG_LEN;
	resp_desc.msg_id = QMI_WLFW_SHUTDOWN_RESP_V01;
	resp_desc.ei_array = wlfw_shutdown_resp_msg_v01_ei;

	ret = qmi_send_req_wait(penv->wlfw_clnt, &req_desc, &req, sizeof(req),
				&resp_desc, &resp, sizeof(resp),
				WLFW_TIMEOUT_MS);
	if (ret < 0) {
		icnss_pr_err("Send modem shutdown req failed, ret: %d\n", ret);
		goto out;
	}

	if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
		icnss_pr_err("QMI modem shutdown request rejected result:%d error:%d\n",
			     resp.resp.result, resp.resp.error);
		ret = -resp.resp.result;
		goto out;
	}

	icnss_pr_dbg("modem shutdown request sent successfully, state: 0x%lx\n",
		     penv->state);
	return 0;

out:
	return ret;
}

static int wlfw_athdiag_read_send_sync_msg(struct icnss_priv *priv,
					   uint32_t offset, uint32_t mem_type,
					   uint32_t data_len, uint8_t *data)
@@ -2534,6 +2584,13 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
	if (code != SUBSYS_BEFORE_SHUTDOWN)
		return NOTIFY_OK;

	if (code == SUBSYS_BEFORE_SHUTDOWN && !notif->crashed) {
		ret = wlfw_send_modem_shutdown_msg();
		if (ret)
		icnss_pr_dbg("Fail to send modem shutdown Indication %d\n",
		ret);
	}

	if (test_bit(ICNSS_PDR_REGISTERED, &priv->state)) {
		set_bit(ICNSS_FW_DOWN, &priv->state);
		icnss_ignore_qmi_timeout(true);
+1829 −372

File changed.

Preview size limit exceeded, changes collapsed.

+532 −167

File changed.

Preview size limit exceeded, changes collapsed.