xref: /wlan-dirver/qca-wifi-host-cmn/wmi/src/wmi_unified_dbr_tlv.c (revision a86b23ee68a2491aede2e03991f3fb37046f4e41)
1 /*
2  * Copyright (c) 2016-2020 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_host_pdev_id_to_target(
54 						wmi_handle,
55 						cfg->pdev_id);
56 	cmd->mod_id = cfg->mod_id;
57 	cmd->base_paddr_lo = cfg->base_paddr_lo;
58 	cmd->base_paddr_hi = cfg->base_paddr_hi;
59 	cmd->head_idx_paddr_lo = cfg->head_idx_paddr_lo;
60 	cmd->head_idx_paddr_hi = cfg->head_idx_paddr_hi;
61 	cmd->tail_idx_paddr_lo = cfg->tail_idx_paddr_lo;
62 	cmd->tail_idx_paddr_hi = cfg->tail_idx_paddr_hi;
63 	cmd->num_elems = cfg->num_elems;
64 	cmd->buf_size = cfg->buf_size;
65 	cmd->num_resp_per_event = cfg->num_resp_per_event;
66 	cmd->event_timeout_ms = cfg->event_timeout_ms;
67 
68 	WMI_LOGD("%s: wmi_dma_ring_cfg_req_fixed_param pdev id %d mod id %d"
69 		  "base paddr lo %x base paddr hi %x head idx paddr lo %x"
70 		  "head idx paddr hi %x tail idx paddr lo %x"
71 		  "tail idx addr hi %x num elems %d buf size %d num resp %d"
72 		  "event timeout %d", __func__, cmd->pdev_id,
73 		  cmd->mod_id, cmd->base_paddr_lo, cmd->base_paddr_hi,
74 		  cmd->head_idx_paddr_lo, cmd->head_idx_paddr_hi,
75 		  cmd->tail_idx_paddr_lo, cmd->tail_idx_paddr_hi,
76 		  cmd->num_elems, cmd->buf_size, cmd->num_resp_per_event,
77 		  cmd->event_timeout_ms);
78 	wmi_mtrace(WMI_PDEV_DMA_RING_CFG_REQ_CMDID, NO_SESSION, 0);
79 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
80 				WMI_PDEV_DMA_RING_CFG_REQ_CMDID);
81 	if (QDF_IS_STATUS_ERROR(ret)) {
82 		WMI_LOGE(FL(":wmi cmd send failed"));
83 		wmi_buf_free(buf);
84 	}
85 
86 	return ret;
87 }
88 
89 static QDF_STATUS extract_scaling_params_service_ready_ext_tlv(
90 			wmi_unified_t wmi_handle,
91 			uint8_t *event, uint8_t idx,
92 			struct wlan_psoc_host_spectral_scaling_params *param)
93 {
94 	WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
95 	wmi_spectral_bin_scaling_params *spectral_bin_scaling_params;
96 
97 	param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *)event;
98 	if (!param_buf)
99 		return QDF_STATUS_E_INVAL;
100 
101 	spectral_bin_scaling_params = &param_buf->wmi_bin_scaling_params[idx];
102 
103 	param->pdev_id = wmi_handle->ops->convert_target_pdev_id_to_host(
104 					wmi_handle,
105 					spectral_bin_scaling_params->pdev_id);
106 	param->low_level_offset = spectral_bin_scaling_params->low_level_offset;
107 	param->formula_id = spectral_bin_scaling_params->formula_id;
108 	param->high_level_offset =
109 		spectral_bin_scaling_params->high_level_offset;
110 	param->rssi_thr = spectral_bin_scaling_params->rssi_thr;
111 	param->default_agc_max_gain =
112 		spectral_bin_scaling_params->default_agc_max_gain;
113 
114 	return QDF_STATUS_SUCCESS;
115 }
116 
117 static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle,
118 		uint8_t *event, struct direct_buf_rx_rsp *param)
119 {
120 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
121 	wmi_dma_buf_release_fixed_param *ev;
122 
123 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
124 	if (!param_buf)
125 		return QDF_STATUS_E_INVAL;
126 
127 	ev = param_buf->fixed_param;
128 	if (!ev)
129 		return QDF_STATUS_E_INVAL;
130 
131 	param->pdev_id = wmi_handle->ops->convert_target_pdev_id_to_host(
132 								wmi_handle,
133 								ev->pdev_id);
134 	param->mod_id = ev->mod_id;
135 	param->num_buf_release_entry = ev->num_buf_release_entry;
136 	param->num_meta_data_entry = ev->num_meta_data_entry;
137 	WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d", __func__,
138 		 param->pdev_id, param->mod_id, param->num_buf_release_entry);
139 
140 	return QDF_STATUS_SUCCESS;
141 }
142 
143 static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle,
144 		uint8_t *event, uint8_t idx, struct direct_buf_rx_entry *param)
145 {
146 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
147 	wmi_dma_buf_release_entry *entry;
148 
149 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
150 	if (!param_buf)
151 		return QDF_STATUS_E_INVAL;
152 
153 	entry = &param_buf->entries[idx];
154 
155 	if (!entry) {
156 		WMI_LOGE("%s: Entry is NULL", __func__);
157 		return QDF_STATUS_E_FAILURE;
158 	}
159 
160 	WMI_LOGD("%s: paddr_lo[%d] = %x", __func__, idx, entry->paddr_lo);
161 
162 	param->paddr_lo = entry->paddr_lo;
163 	param->paddr_hi = entry->paddr_hi;
164 
165 	return QDF_STATUS_SUCCESS;
166 }
167 
168 static QDF_STATUS extract_dbr_buf_metadata_tlv(
169 		wmi_unified_t wmi_handle, uint8_t *event,
170 		uint8_t idx, struct direct_buf_rx_metadata *param)
171 {
172 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
173 	wmi_dma_buf_release_spectral_meta_data *entry;
174 
175 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
176 	if (!param_buf)
177 		return QDF_STATUS_E_INVAL;
178 
179 	entry = &param_buf->meta_data[idx];
180 
181 	if (!entry) {
182 		WMI_LOGE("%s: Entry is NULL", __func__);
183 		return QDF_STATUS_E_FAILURE;
184 	}
185 
186 	qdf_mem_copy(param->noisefloor, entry->noise_floor,
187 		     qdf_min(sizeof(entry->noise_floor),
188 			     sizeof(param->noisefloor)));
189 	param->reset_delay = entry->reset_delay;
190 	param->cfreq1 = entry->freq1;
191 	param->cfreq2 = entry->freq2;
192 	param->ch_width = entry->ch_width;
193 
194 	return QDF_STATUS_SUCCESS;
195 }
196 
197 void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle)
198 {
199 	struct wmi_ops *ops = wmi_handle->ops;
200 
201 	ops->send_dbr_cfg_cmd = send_dbr_cfg_cmd_tlv;
202 	ops->extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv;
203 	ops->extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv;
204 	ops->extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv;
205 	ops->extract_scaling_params_service_ready_ext =
206 			extract_scaling_params_service_ready_ext_tlv;
207 }
208