xref: /wlan-dirver/qca-wifi-host-cmn/wmi/src/wmi_unified_dbr_tlv.c (revision 5c881ec3ec13496062c59017e3dbf2992a7585ca)
1 /*
2  * Copyright (c) 2016-2018 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 #include <osdep.h>
20 #include "wmi.h"
21 #include "wmi_unified_priv.h"
22 #include "wmi_unified_dbr_param.h"
23 #include "wmi_unified_dbr_api.h"
24 
25 /**
26  * send_dbr_cfg_cmd_tlv() - configure DMA rings for Direct Buf RX
27  * @wmi_handle: wmi handle
28  * @data_len: len of dma cfg req
29  * @data: dma cfg req
30  *
31  * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
32  */
33 static QDF_STATUS send_dbr_cfg_cmd_tlv(wmi_unified_t wmi_handle,
34 				struct direct_buf_rx_cfg_req *cfg)
35 {
36 	wmi_buf_t buf;
37 	wmi_dma_ring_cfg_req_fixed_param *cmd;
38 	QDF_STATUS ret;
39 	int32_t len = sizeof(*cmd);
40 
41 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
42 	if (!buf) {
43 		WMI_LOGE(FL("wmi_buf_alloc failed"));
44 		return QDF_STATUS_E_FAILURE;
45 	}
46 
47 	cmd = (wmi_dma_ring_cfg_req_fixed_param *)wmi_buf_data(buf);
48 
49 	WMITLV_SET_HDR(&cmd->tlv_header,
50 		WMITLV_TAG_STRUC_wmi_dma_ring_cfg_req_fixed_param,
51 		WMITLV_GET_STRUCT_TLVLEN(wmi_dma_ring_cfg_req_fixed_param));
52 
53 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
54 						cfg->pdev_id);
55 	cmd->mod_id = cfg->mod_id;
56 	cmd->base_paddr_lo = cfg->base_paddr_lo;
57 	cmd->base_paddr_hi = cfg->base_paddr_hi;
58 	cmd->head_idx_paddr_lo = cfg->head_idx_paddr_lo;
59 	cmd->head_idx_paddr_hi = cfg->head_idx_paddr_hi;
60 	cmd->tail_idx_paddr_lo = cfg->tail_idx_paddr_lo;
61 	cmd->tail_idx_paddr_hi = cfg->tail_idx_paddr_hi;
62 	cmd->num_elems = cfg->num_elems;
63 	cmd->buf_size = cfg->buf_size;
64 	cmd->num_resp_per_event = cfg->num_resp_per_event;
65 	cmd->event_timeout_ms = cfg->event_timeout_ms;
66 
67 	WMI_LOGD("%s: wmi_dma_ring_cfg_req_fixed_param pdev id %d mod id %d"
68 		  "base paddr lo %x base paddr hi %x head idx paddr lo %x"
69 		  "head idx paddr hi %x tail idx paddr lo %x"
70 		  "tail idx addr hi %x num elems %d buf size %d num resp %d"
71 		  "event timeout %d", __func__, cmd->pdev_id,
72 		  cmd->mod_id, cmd->base_paddr_lo, cmd->base_paddr_hi,
73 		  cmd->head_idx_paddr_lo, cmd->head_idx_paddr_hi,
74 		  cmd->tail_idx_paddr_lo, cmd->tail_idx_paddr_hi,
75 		  cmd->num_elems, cmd->buf_size, cmd->num_resp_per_event,
76 		  cmd->event_timeout_ms);
77 	wmi_mtrace(WMI_PDEV_DMA_RING_CFG_REQ_CMDID, NO_SESSION, 0);
78 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
79 				WMI_PDEV_DMA_RING_CFG_REQ_CMDID);
80 	if (QDF_IS_STATUS_ERROR(ret)) {
81 		WMI_LOGE(FL(":wmi cmd send failed"));
82 		wmi_buf_free(buf);
83 	}
84 
85 	return ret;
86 }
87 
88 static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle,
89 		uint8_t *event, struct direct_buf_rx_rsp *param)
90 {
91 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
92 	wmi_dma_buf_release_fixed_param *ev;
93 
94 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
95 	if (!param_buf)
96 		return QDF_STATUS_E_INVAL;
97 
98 	ev = param_buf->fixed_param;
99 	if (!ev)
100 		return QDF_STATUS_E_INVAL;
101 
102 	param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
103 								ev->pdev_id);
104 	param->mod_id = ev->mod_id;
105 	param->num_buf_release_entry = ev->num_buf_release_entry;
106 	param->num_meta_data_entry = ev->num_meta_data_entry;
107 	WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d", __func__,
108 		 param->pdev_id, param->mod_id, param->num_buf_release_entry);
109 
110 	return QDF_STATUS_SUCCESS;
111 }
112 
113 static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle,
114 		uint8_t *event, uint8_t idx, struct direct_buf_rx_entry *param)
115 {
116 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
117 	wmi_dma_buf_release_entry *entry;
118 
119 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
120 	if (!param_buf)
121 		return QDF_STATUS_E_INVAL;
122 
123 	entry = &param_buf->entries[idx];
124 
125 	if (!entry) {
126 		WMI_LOGE("%s: Entry is NULL", __func__);
127 		return QDF_STATUS_E_FAILURE;
128 	}
129 
130 	WMI_LOGD("%s: paddr_lo[%d] = %x", __func__, idx, entry->paddr_lo);
131 
132 	param->paddr_lo = entry->paddr_lo;
133 	param->paddr_hi = entry->paddr_hi;
134 
135 	return QDF_STATUS_SUCCESS;
136 }
137 
138 static QDF_STATUS extract_dbr_buf_metadata_tlv(
139 		wmi_unified_t wmi_handle, uint8_t *event,
140 		uint8_t idx, struct direct_buf_rx_metadata *param)
141 {
142 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
143 	wmi_dma_buf_release_spectral_meta_data *entry;
144 
145 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
146 	if (!param_buf)
147 		return QDF_STATUS_E_INVAL;
148 
149 	entry = &param_buf->meta_data[idx];
150 
151 	if (!entry) {
152 		WMI_LOGE("%s: Entry is NULL", __func__);
153 		return QDF_STATUS_E_FAILURE;
154 	}
155 
156 	qdf_mem_copy(param->noisefloor, entry->noise_floor,
157 		     sizeof(entry->noise_floor));
158 	return QDF_STATUS_SUCCESS;
159 }
160 
161 void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle)
162 {
163 	struct wmi_ops *ops = wmi_handle->ops;
164 
165 	ops->send_dbr_cfg_cmd = send_dbr_cfg_cmd_tlv;
166 	ops->extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv;
167 	ops->extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv;
168 	ops->extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv;
169 }
170