xref: /wlan-dirver/qcacld-3.0/core/wma/src/wma_fw_state.c (revision bf14ba81a9dde77532035d124922099fe95cd35d)
1 /*
2  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: wma_fw_state.c
21  *
22  * The implementation for getting firmware state
23  */
24 
25 #include "wma_fw_state.h"
26 #include "wmi_unified_api.h"
27 
28 QDF_STATUS wma_get_fw_state(tp_wma_handle wma_handle)
29 {
30 	wmi_echo_cmd_fixed_param *cmd;
31 	wmi_buf_t wmi_buf;
32 	uint32_t len = sizeof(*cmd);
33 
34 	if (!wma_handle) {
35 		WMA_LOGE(FL("WMA is closed, can not issue cmd"));
36 		return QDF_STATUS_E_INVAL;
37 	}
38 
39 	wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
40 	if (!wmi_buf)
41 		return QDF_STATUS_E_NOMEM;
42 
43 	cmd = (wmi_echo_cmd_fixed_param *)wmi_buf_data(wmi_buf);
44 	WMITLV_SET_HDR(&cmd->tlv_header,
45 		       WMITLV_TAG_STRUC_wmi_echo_cmd_fixed_param,
46 		       WMITLV_GET_STRUCT_TLVLEN(
47 		       wmi_echo_cmd_fixed_param));
48 	cmd->value = true;
49 
50 	if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
51 				 WMI_ECHO_CMDID)) {
52 		wmi_buf_free(wmi_buf);
53 		return QDF_STATUS_E_FAILURE;
54 	}
55 
56 	return QDF_STATUS_SUCCESS;
57 }
58 
59 /**
60  * wma_echo_event_handler() - process fw state rsp
61  * @handle: wma interface
62  * @buf: wmi event buf pointer
63  * @len: length of event buffer
64  *
65  * This function will send eWNI_SME_FW_STATUS_IND to SME
66  *
67  * Return: 0 for success or error code
68  */
69 static int wma_echo_event_handler(void *handle, uint8_t *buf, uint32_t len)
70 {
71 	struct scheduler_msg sme_msg = {
72 		.type = eWNI_SME_FW_STATUS_IND,
73 	};
74 	QDF_STATUS qdf_status;
75 
76 	WMA_LOGD("Received Echo reply from firmware!");
77 
78 	qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
79 					    QDF_MODULE_ID_SME,
80 					    QDF_MODULE_ID_SME, &sme_msg);
81 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
82 		WMA_LOGE("%s: Fail to post fw state reply msg", __func__);
83 		return -EINVAL;
84 	}
85 
86 	return 0;
87 }
88 
89 void wma_register_fw_state_events(wmi_unified_t wmi_handle)
90 {
91 	wmi_unified_register_event_handler(wmi_handle,
92 					   wmi_echo_event_id,
93 					   wma_echo_event_handler,
94 					   WMA_RX_SERIALIZER_CTX);
95 }
96