xref: /wlan-dirver/qca-wifi-host-cmn/wmi/src/wmi_unified_dbr_tlv.c (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
1 /*
2  * Copyright (c) 2016-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 #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_scaling_params_service_ready_ext_tlv(
89 			wmi_unified_t wmi_handle,
90 			uint8_t *event, uint8_t idx,
91 			struct wlan_psoc_host_spectral_scaling_params *param)
92 {
93 	WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf;
94 	wmi_spectral_bin_scaling_params *spectral_bin_scaling_params;
95 
96 	param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *)event;
97 	if (!param_buf)
98 		return QDF_STATUS_E_INVAL;
99 
100 	spectral_bin_scaling_params = &param_buf->wmi_bin_scaling_params[idx];
101 
102 	param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
103 					spectral_bin_scaling_params->pdev_id);
104 	param->low_level_offset = spectral_bin_scaling_params->low_level_offset;
105 	param->formula_id = spectral_bin_scaling_params->formula_id;
106 	param->high_level_offset =
107 		spectral_bin_scaling_params->high_level_offset;
108 	param->rssi_thr = spectral_bin_scaling_params->rssi_thr;
109 	param->default_agc_max_gain =
110 		spectral_bin_scaling_params->default_agc_max_gain;
111 
112 	return QDF_STATUS_SUCCESS;
113 }
114 
115 static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle,
116 		uint8_t *event, struct direct_buf_rx_rsp *param)
117 {
118 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
119 	wmi_dma_buf_release_fixed_param *ev;
120 
121 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
122 	if (!param_buf)
123 		return QDF_STATUS_E_INVAL;
124 
125 	ev = param_buf->fixed_param;
126 	if (!ev)
127 		return QDF_STATUS_E_INVAL;
128 
129 	param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
130 								ev->pdev_id);
131 	param->mod_id = ev->mod_id;
132 	param->num_buf_release_entry = ev->num_buf_release_entry;
133 	param->num_meta_data_entry = ev->num_meta_data_entry;
134 	WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d", __func__,
135 		 param->pdev_id, param->mod_id, param->num_buf_release_entry);
136 
137 	return QDF_STATUS_SUCCESS;
138 }
139 
140 static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle,
141 		uint8_t *event, uint8_t idx, struct direct_buf_rx_entry *param)
142 {
143 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
144 	wmi_dma_buf_release_entry *entry;
145 
146 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
147 	if (!param_buf)
148 		return QDF_STATUS_E_INVAL;
149 
150 	entry = &param_buf->entries[idx];
151 
152 	if (!entry) {
153 		WMI_LOGE("%s: Entry is NULL", __func__);
154 		return QDF_STATUS_E_FAILURE;
155 	}
156 
157 	WMI_LOGD("%s: paddr_lo[%d] = %x", __func__, idx, entry->paddr_lo);
158 
159 	param->paddr_lo = entry->paddr_lo;
160 	param->paddr_hi = entry->paddr_hi;
161 
162 	return QDF_STATUS_SUCCESS;
163 }
164 
165 static QDF_STATUS extract_dbr_buf_metadata_tlv(
166 		wmi_unified_t wmi_handle, uint8_t *event,
167 		uint8_t idx, struct direct_buf_rx_metadata *param)
168 {
169 	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
170 	wmi_dma_buf_release_spectral_meta_data *entry;
171 
172 	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
173 	if (!param_buf)
174 		return QDF_STATUS_E_INVAL;
175 
176 	entry = &param_buf->meta_data[idx];
177 
178 	if (!entry) {
179 		WMI_LOGE("%s: Entry is NULL", __func__);
180 		return QDF_STATUS_E_FAILURE;
181 	}
182 
183 	qdf_mem_copy(param->noisefloor, entry->noise_floor,
184 		     qdf_min(sizeof(entry->noise_floor),
185 			     sizeof(param->noisefloor)));
186 	param->reset_delay = entry->reset_delay;
187 
188 	return QDF_STATUS_SUCCESS;
189 }
190 
191 void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle)
192 {
193 	struct wmi_ops *ops = wmi_handle->ops;
194 
195 	ops->send_dbr_cfg_cmd = send_dbr_cfg_cmd_tlv;
196 	ops->extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv;
197 	ops->extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv;
198 	ops->extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv;
199 	ops->extract_scaling_params_service_ready_ext =
200 			extract_scaling_params_service_ready_ext_tlv;
201 }
202