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