|
@@ -4072,254 +4072,6 @@ struct wma_txrx_node *wma_get_interface_by_vdev_id(uint8_t vdev_id)
|
|
|
return &wma->interfaces[vdev_id];
|
|
|
}
|
|
|
|
|
|
-#if defined(QCA_WIFI_FTM)
|
|
|
-/**
|
|
|
- * wma_utf_rsp() - utf response
|
|
|
- * @wma_handle: wma handle
|
|
|
- * @payload: payload
|
|
|
- * @len: length of payload
|
|
|
- *
|
|
|
- * Return: 0 for success or error code
|
|
|
- */
|
|
|
-static int wma_utf_rsp(tp_wma_handle wma_handle, uint8_t **payload,
|
|
|
- uint32_t *len)
|
|
|
-{
|
|
|
- int ret = -1;
|
|
|
- uint32_t payload_len;
|
|
|
-
|
|
|
- payload_len = wma_handle->utf_event_info.length;
|
|
|
- if (payload_len) {
|
|
|
- ret = 0;
|
|
|
-
|
|
|
- /*
|
|
|
- * The first 4 bytes holds the payload size
|
|
|
- * and the actual payload sits next to it
|
|
|
- */
|
|
|
- *payload = (uint8_t *) qdf_mem_malloc((uint32_t) payload_len
|
|
|
- + sizeof(A_UINT32));
|
|
|
- *(A_UINT32 *) &(*payload[0]) =
|
|
|
- wma_handle->utf_event_info.length;
|
|
|
- memcpy(*payload + sizeof(A_UINT32),
|
|
|
- wma_handle->utf_event_info.data, payload_len);
|
|
|
- wma_handle->utf_event_info.length = 0;
|
|
|
- *len = payload_len;
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_post_ftm_response() - post ftm response to upper layer
|
|
|
- * @wma_handle: wma handle
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-static void wma_post_ftm_response(tp_wma_handle wma_handle)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- uint8_t *payload;
|
|
|
- uint32_t data_len;
|
|
|
- struct scheduler_msg msg = { 0 };
|
|
|
- QDF_STATUS status;
|
|
|
-
|
|
|
- ret = wma_utf_rsp(wma_handle, &payload, &data_len);
|
|
|
-
|
|
|
- if (ret)
|
|
|
- return;
|
|
|
-
|
|
|
- sys_build_message_header(SYS_MSG_ID_FTM_RSP, &msg);
|
|
|
- msg.bodyptr = payload;
|
|
|
- msg.bodyval = 0;
|
|
|
-
|
|
|
- status = scheduler_post_msg(QDF_MODULE_ID_SYS, &msg);
|
|
|
-
|
|
|
- if (status != QDF_STATUS_SUCCESS) {
|
|
|
- WMA_LOGE("failed to post ftm response to SYS");
|
|
|
- qdf_mem_free(payload);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_process_utf_event() - process utf event
|
|
|
- * @handle: wma handle
|
|
|
- * @datap: data buffer
|
|
|
- * @dataplen: data length
|
|
|
- *
|
|
|
- * Return: 0 for success or error code
|
|
|
- */
|
|
|
-static int
|
|
|
-wma_process_utf_event(WMA_HANDLE handle, uint8_t *datap, uint32_t dataplen)
|
|
|
-{
|
|
|
- tp_wma_handle wma_handle = (tp_wma_handle) handle;
|
|
|
- struct seg_hdr_info segHdrInfo;
|
|
|
- uint8_t totalNumOfSegments, currentSeq;
|
|
|
- WMI_PDEV_UTF_EVENTID_param_tlvs *param_buf;
|
|
|
- uint8_t *data;
|
|
|
- uint32_t datalen;
|
|
|
-
|
|
|
- param_buf = (WMI_PDEV_UTF_EVENTID_param_tlvs *) datap;
|
|
|
- if (!param_buf) {
|
|
|
- WMA_LOGE("Get NULL point message from FW");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
- data = param_buf->data;
|
|
|
- datalen = param_buf->num_data;
|
|
|
-
|
|
|
- if (datalen < sizeof(segHdrInfo)) {
|
|
|
- WMA_LOGE("message size %d is smaller than struct seg_hdr_info",
|
|
|
- datalen);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- segHdrInfo = *(struct seg_hdr_info *) &(data[0]);
|
|
|
-
|
|
|
- wma_handle->utf_event_info.currentSeq = (segHdrInfo.segmentInfo & 0xF);
|
|
|
-
|
|
|
- currentSeq = (segHdrInfo.segmentInfo & 0xF);
|
|
|
- totalNumOfSegments = (segHdrInfo.segmentInfo >> 4) & 0xF;
|
|
|
-
|
|
|
- datalen = datalen - sizeof(segHdrInfo);
|
|
|
-
|
|
|
- if (currentSeq == 0) {
|
|
|
- wma_handle->utf_event_info.expectedSeq = 0;
|
|
|
- wma_handle->utf_event_info.offset = 0;
|
|
|
- } else {
|
|
|
- if (wma_handle->utf_event_info.expectedSeq != currentSeq)
|
|
|
- WMA_LOGE("Mismatch in expecting seq expected Seq %d got seq %d",
|
|
|
- wma_handle->utf_event_info.expectedSeq,
|
|
|
- currentSeq);
|
|
|
- }
|
|
|
-
|
|
|
- if ((datalen > MAX_UTF_EVENT_LENGTH) ||
|
|
|
- (wma_handle->utf_event_info.offset >
|
|
|
- (MAX_UTF_EVENT_LENGTH - datalen))) {
|
|
|
- WMA_LOGE("Excess data from firmware, offset:%zu, len:%d",
|
|
|
- wma_handle->utf_event_info.offset, datalen);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
- memcpy(&wma_handle->utf_event_info.
|
|
|
- data[wma_handle->utf_event_info.offset],
|
|
|
- &data[sizeof(segHdrInfo)], datalen);
|
|
|
- wma_handle->utf_event_info.offset =
|
|
|
- wma_handle->utf_event_info.offset + datalen;
|
|
|
- wma_handle->utf_event_info.expectedSeq++;
|
|
|
-
|
|
|
- if (wma_handle->utf_event_info.expectedSeq == totalNumOfSegments) {
|
|
|
- if (wma_handle->utf_event_info.offset != segHdrInfo.len)
|
|
|
- WMA_LOGE("All segs received total len mismatch.. len %zu total len %d",
|
|
|
- wma_handle->utf_event_info.offset,
|
|
|
- segHdrInfo.len);
|
|
|
-
|
|
|
- wma_handle->utf_event_info.length =
|
|
|
- wma_handle->utf_event_info.offset;
|
|
|
- }
|
|
|
-
|
|
|
- wma_post_ftm_response(wma_handle);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_utf_detach() - utf detach
|
|
|
- * @wma_handle: wma handle
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void wma_utf_detach(tp_wma_handle wma_handle)
|
|
|
-{
|
|
|
- if (wma_handle->utf_event_info.data) {
|
|
|
- qdf_mem_free(wma_handle->utf_event_info.data);
|
|
|
- wma_handle->utf_event_info.data = NULL;
|
|
|
- wma_handle->utf_event_info.length = 0;
|
|
|
- wmi_unified_unregister_event_handler(wma_handle->wmi_handle,
|
|
|
- wmi_pdev_utf_event_id);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_utf_attach() - utf attach
|
|
|
- * @wma_handle: wma handle
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void wma_utf_attach(tp_wma_handle wma_handle)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- wma_handle->utf_event_info.data = (unsigned char *)
|
|
|
- qdf_mem_malloc(MAX_UTF_EVENT_LENGTH);
|
|
|
- wma_handle->utf_event_info.length = 0;
|
|
|
-
|
|
|
- ret = wmi_unified_register_event_handler(wma_handle->wmi_handle,
|
|
|
- wmi_pdev_utf_event_id,
|
|
|
- wma_process_utf_event,
|
|
|
- WMA_RX_SERIALIZER_CTX);
|
|
|
-
|
|
|
- if (ret)
|
|
|
- WMA_LOGE("%s: Failed to register UTF event callback", __func__);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_utf_cmd() - utf command
|
|
|
- * @wma_handle: wma handle
|
|
|
- * @data: data
|
|
|
- * @len: length
|
|
|
- *
|
|
|
- * Return: QDF_STATUS_SUCCESS for success or error code
|
|
|
- */
|
|
|
-static QDF_STATUS wma_utf_cmd(tp_wma_handle wma_handle, uint8_t *data,
|
|
|
- uint16_t len)
|
|
|
-{
|
|
|
- struct pdev_utf_params param = {0};
|
|
|
-
|
|
|
- wma_handle->utf_event_info.length = 0;
|
|
|
- param.utf_payload = data;
|
|
|
- param.len = len;
|
|
|
-
|
|
|
- return wmi_unified_pdev_utf_cmd_send(wma_handle->wmi_handle, ¶m,
|
|
|
- WMA_WILDCARD_PDEV_ID);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_process_ftm_command() - process ftm command
|
|
|
- * @wma_handle: wma handle
|
|
|
- * @msg_buffer: message buffer
|
|
|
- *
|
|
|
- * Return: QDF_STATUS_SUCCESS for success or error code
|
|
|
- */
|
|
|
-QDF_STATUS
|
|
|
-wma_process_ftm_command(tp_wma_handle wma_handle,
|
|
|
- struct ar6k_testmode_cmd_data *msg_buffer)
|
|
|
-{
|
|
|
- uint8_t *data = NULL;
|
|
|
- uint16_t len = 0;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (!msg_buffer)
|
|
|
- return QDF_STATUS_E_INVAL;
|
|
|
-
|
|
|
- if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) {
|
|
|
- WMA_LOGE("FTM command issued in non-FTM mode");
|
|
|
- qdf_mem_free(msg_buffer->data);
|
|
|
- qdf_mem_free(msg_buffer);
|
|
|
- return QDF_STATUS_E_NOSUPPORT;
|
|
|
- }
|
|
|
-
|
|
|
- data = msg_buffer->data;
|
|
|
- len = msg_buffer->len;
|
|
|
-
|
|
|
- ret = wma_utf_cmd(wma_handle, data, len);
|
|
|
-
|
|
|
- qdf_mem_free(msg_buffer->data);
|
|
|
- qdf_mem_free(msg_buffer);
|
|
|
-
|
|
|
- if (ret)
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
-
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-#endif /* QCA_WIFI_FTM */
|
|
|
-
|
|
|
QDF_STATUS wma_get_wcnss_software_version(uint8_t *version,
|
|
|
uint32_t version_buffer_size)
|
|
|
{
|