xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_vdev_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #include <osdep.h>
21*5113495bSYour Name #include <qdf_module.h>
22*5113495bSYour Name #include <qdf_list.h>
23*5113495bSYour Name #include <qdf_platform.h>
24*5113495bSYour Name #include <wmi_unified_vdev_tlv.h>
25*5113495bSYour Name #include <wlan_vdev_mgr_tgt_if_tx_defs.h>
26*5113495bSYour Name 
27*5113495bSYour Name static QDF_STATUS
send_vdev_config_ratemask_cmd_tlv(struct wmi_unified * wmi_handle,struct config_ratemask_params * param)28*5113495bSYour Name send_vdev_config_ratemask_cmd_tlv(struct wmi_unified *wmi_handle,
29*5113495bSYour Name 				  struct config_ratemask_params *param)
30*5113495bSYour Name {
31*5113495bSYour Name 	wmi_vdev_config_ratemask_cmd_fixed_param *cmd;
32*5113495bSYour Name 	wmi_buf_t buf;
33*5113495bSYour Name 	int32_t len = sizeof(*cmd);
34*5113495bSYour Name 
35*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
36*5113495bSYour Name 	if (!buf) {
37*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
38*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
39*5113495bSYour Name 	}
40*5113495bSYour Name 	cmd = (wmi_vdev_config_ratemask_cmd_fixed_param *)wmi_buf_data(buf);
41*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
42*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_config_ratemask_fixed_param,
43*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
44*5113495bSYour Name 				wmi_vdev_config_ratemask_cmd_fixed_param));
45*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
46*5113495bSYour Name 	cmd->type = param->type;
47*5113495bSYour Name 	cmd->mask_lower32 = param->lower32;
48*5113495bSYour Name 	cmd->mask_higher32 = param->higher32;
49*5113495bSYour Name 	cmd->mask_lower32_2 = param->lower32_2;
50*5113495bSYour Name 	cmd->mask_higher32_2 = param->higher32_2;
51*5113495bSYour Name 
52*5113495bSYour Name 	wmi_debug("vdev_id %d type %d lower32 0x%x lower32_2 0x%x",
53*5113495bSYour Name 		  cmd->vdev_id, cmd->type, cmd->mask_lower32,
54*5113495bSYour Name 		  cmd->mask_lower32_2);
55*5113495bSYour Name 	wmi_debug("higher32 0x%x higher32_2 0x%x", cmd->mask_higher32,
56*5113495bSYour Name 		  cmd->mask_higher32_2);
57*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_RATEMASK_CMDID, cmd->vdev_id, 0);
58*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
59*5113495bSYour Name 				 WMI_VDEV_RATEMASK_CMDID)) {
60*5113495bSYour Name 		wmi_err("Setting vdev ratemask failed");
61*5113495bSYour Name 		wmi_buf_free(buf);
62*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
63*5113495bSYour Name 	}
64*5113495bSYour Name 
65*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
66*5113495bSYour Name }
67*5113495bSYour Name 
68*5113495bSYour Name static QDF_STATUS
send_beacon_send_cmd_tlv(struct wmi_unified * wmi_handle,struct beacon_params * param)69*5113495bSYour Name send_beacon_send_cmd_tlv(struct wmi_unified *wmi_handle,
70*5113495bSYour Name 			 struct beacon_params *param)
71*5113495bSYour Name {
72*5113495bSYour Name 	QDF_STATUS ret;
73*5113495bSYour Name 	wmi_bcn_send_from_host_cmd_fixed_param *cmd;
74*5113495bSYour Name 	wmi_buf_t wmi_buf;
75*5113495bSYour Name 	qdf_dma_addr_t dma_addr;
76*5113495bSYour Name 	uint32_t dtim_flag = 0;
77*5113495bSYour Name 
78*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
79*5113495bSYour Name 	if (!wmi_buf) {
80*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
81*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
82*5113495bSYour Name 	}
83*5113495bSYour Name 	if (param->is_dtim_count_zero) {
84*5113495bSYour Name 		dtim_flag |= WMI_BCN_SEND_DTIM_ZERO;
85*5113495bSYour Name 		if (param->is_bitctl_reqd) {
86*5113495bSYour Name 			/* deliver CAB traffic in next DTIM beacon */
87*5113495bSYour Name 			dtim_flag |= WMI_BCN_SEND_DTIM_BITCTL_SET;
88*5113495bSYour Name 		}
89*5113495bSYour Name 	}
90*5113495bSYour Name 	cmd = (wmi_bcn_send_from_host_cmd_fixed_param *)wmi_buf_data(wmi_buf);
91*5113495bSYour Name 	WMITLV_SET_HDR(
92*5113495bSYour Name 		&cmd->tlv_header,
93*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_bcn_send_from_host_cmd_fixed_param,
94*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
95*5113495bSYour Name 				(wmi_bcn_send_from_host_cmd_fixed_param));
96*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
97*5113495bSYour Name 	cmd->data_len = qdf_nbuf_len(param->wbuf);
98*5113495bSYour Name 	cmd->frame_ctrl = param->frame_ctrl;
99*5113495bSYour Name 	cmd->dtim_flag = dtim_flag;
100*5113495bSYour Name 	dma_addr = qdf_nbuf_get_frag_paddr(param->wbuf, 0);
101*5113495bSYour Name 	cmd->frag_ptr_lo = qdf_get_lower_32_bits(dma_addr);
102*5113495bSYour Name #if defined(HTT_PADDR64)
103*5113495bSYour Name 	cmd->frag_ptr_hi = qdf_get_upper_32_bits(dma_addr) & 0x1F;
104*5113495bSYour Name #endif
105*5113495bSYour Name 	cmd->bcn_antenna = param->bcn_txant;
106*5113495bSYour Name 
107*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_SEND_BCN_CMDID, cmd->vdev_id, 0);
108*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, wmi_buf, sizeof(*cmd),
109*5113495bSYour Name 				   WMI_PDEV_SEND_BCN_CMDID);
110*5113495bSYour Name 	if (ret != QDF_STATUS_SUCCESS) {
111*5113495bSYour Name 		wmi_err("Failed to send bcn: %d", ret);
112*5113495bSYour Name 		wmi_buf_free(wmi_buf);
113*5113495bSYour Name 	}
114*5113495bSYour Name 
115*5113495bSYour Name 	return ret;
116*5113495bSYour Name }
117*5113495bSYour Name 
118*5113495bSYour Name static QDF_STATUS
extract_tbttoffset_num_vdevs_tlv(struct wmi_unified * wmi_handle,void * evt_buf,uint32_t * num_vdevs)119*5113495bSYour Name extract_tbttoffset_num_vdevs_tlv(struct wmi_unified *wmi_handle, void *evt_buf,
120*5113495bSYour Name 				 uint32_t *num_vdevs)
121*5113495bSYour Name {
122*5113495bSYour Name 	WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *param_buf;
123*5113495bSYour Name 	wmi_tbtt_offset_event_fixed_param *tbtt_offset_event;
124*5113495bSYour Name 	uint32_t vdev_map;
125*5113495bSYour Name 
126*5113495bSYour Name 	param_buf = (WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *)evt_buf;
127*5113495bSYour Name 	if (!param_buf) {
128*5113495bSYour Name 		wmi_err("Invalid tbtt update ext event buffer");
129*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
130*5113495bSYour Name 	}
131*5113495bSYour Name 	tbtt_offset_event = param_buf->fixed_param;
132*5113495bSYour Name 	vdev_map = tbtt_offset_event->vdev_map;
133*5113495bSYour Name 	*num_vdevs = wmi_vdev_map_to_num_vdevs(vdev_map);
134*5113495bSYour Name 
135*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
136*5113495bSYour Name }
137*5113495bSYour Name 
138*5113495bSYour Name static QDF_STATUS
send_peer_filter_set_tx_cmd_tlv(struct wmi_unified * wmi_handle,uint8_t macaddr[],struct set_tx_peer_filter * param)139*5113495bSYour Name send_peer_filter_set_tx_cmd_tlv(struct wmi_unified *wmi_handle,
140*5113495bSYour Name 				uint8_t macaddr[],
141*5113495bSYour Name 				struct set_tx_peer_filter *param)
142*5113495bSYour Name {
143*5113495bSYour Name 	wmi_peer_tx_filter_cmd_fixed_param *cmd;
144*5113495bSYour Name 	wmi_buf_t buf;
145*5113495bSYour Name 	uint32_t len = sizeof(*cmd);
146*5113495bSYour Name 
147*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
148*5113495bSYour Name 	if (!buf)
149*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
150*5113495bSYour Name 
151*5113495bSYour Name 	cmd = (wmi_peer_tx_filter_cmd_fixed_param *)wmi_buf_data(buf);
152*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
153*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_peer_tx_filter_cmd_fixed_param,
154*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
155*5113495bSYour Name 		       wmi_peer_tx_filter_cmd_fixed_param));
156*5113495bSYour Name 
157*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
158*5113495bSYour Name 	cmd->action = param->action;
159*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(macaddr, &cmd->addr);
160*5113495bSYour Name 
161*5113495bSYour Name 	wmi_mtrace(WMI_PEER_TX_FILTER_CMDID, cmd->vdev_id, 0);
162*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
163*5113495bSYour Name 				 WMI_PEER_TX_FILTER_CMDID)) {
164*5113495bSYour Name 		wmi_err("Failed to set neighbour rx param");
165*5113495bSYour Name 		wmi_buf_free(buf);
166*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
167*5113495bSYour Name 	}
168*5113495bSYour Name 
169*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
170*5113495bSYour Name }
171*5113495bSYour Name 
172*5113495bSYour Name static QDF_STATUS
send_vdev_set_neighbour_rx_cmd_tlv(struct wmi_unified * wmi_handle,uint8_t macaddr[QDF_MAC_ADDR_SIZE],struct set_neighbour_rx_params * param)173*5113495bSYour Name send_vdev_set_neighbour_rx_cmd_tlv(struct wmi_unified *wmi_handle,
174*5113495bSYour Name 				   uint8_t macaddr[QDF_MAC_ADDR_SIZE],
175*5113495bSYour Name 				   struct set_neighbour_rx_params *param)
176*5113495bSYour Name {
177*5113495bSYour Name 	wmi_vdev_filter_nrp_config_cmd_fixed_param *cmd;
178*5113495bSYour Name 	wmi_buf_t buf;
179*5113495bSYour Name 	int32_t len = sizeof(*cmd);
180*5113495bSYour Name 
181*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
182*5113495bSYour Name 	if (!buf) {
183*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
184*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
185*5113495bSYour Name 	}
186*5113495bSYour Name 	cmd = (wmi_vdev_filter_nrp_config_cmd_fixed_param *)wmi_buf_data(buf);
187*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
188*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_filter_nrp_config_cmd_fixed_param,
189*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
190*5113495bSYour Name 		       wmi_vdev_filter_nrp_config_cmd_fixed_param));
191*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
192*5113495bSYour Name 	cmd->bssid_idx = param->idx;
193*5113495bSYour Name 	cmd->action = param->action;
194*5113495bSYour Name 	cmd->type = param->type;
195*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(macaddr, &cmd->addr);
196*5113495bSYour Name 	cmd->flag = 0;
197*5113495bSYour Name 
198*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID, cmd->vdev_id, 0);
199*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
200*5113495bSYour Name 				 WMI_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID)) {
201*5113495bSYour Name 		wmi_err("Failed to set neighbour rx param");
202*5113495bSYour Name 		wmi_buf_free(buf);
203*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
204*5113495bSYour Name 	}
205*5113495bSYour Name 
206*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
207*5113495bSYour Name }
208*5113495bSYour Name 
209*5113495bSYour Name static QDF_STATUS
extract_vdev_start_resp_tlv(struct wmi_unified * wmi_handle,void * evt_buf,struct vdev_start_response * vdev_rsp)210*5113495bSYour Name extract_vdev_start_resp_tlv(struct wmi_unified *wmi_handle, void *evt_buf,
211*5113495bSYour Name 			    struct vdev_start_response *vdev_rsp)
212*5113495bSYour Name {
213*5113495bSYour Name 	WMI_VDEV_START_RESP_EVENTID_param_tlvs *param_buf;
214*5113495bSYour Name 	wmi_vdev_start_response_event_fixed_param *ev;
215*5113495bSYour Name 
216*5113495bSYour Name 	param_buf = (WMI_VDEV_START_RESP_EVENTID_param_tlvs *)evt_buf;
217*5113495bSYour Name 	if (!param_buf) {
218*5113495bSYour Name 		wmi_err("Invalid start response event buffer");
219*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
220*5113495bSYour Name 	}
221*5113495bSYour Name 
222*5113495bSYour Name 	ev = param_buf->fixed_param;
223*5113495bSYour Name 	if (!ev) {
224*5113495bSYour Name 		wmi_err("Invalid start response event buffer");
225*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
226*5113495bSYour Name 	}
227*5113495bSYour Name 
228*5113495bSYour Name 	qdf_mem_zero(vdev_rsp, sizeof(*vdev_rsp));
229*5113495bSYour Name 
230*5113495bSYour Name 	vdev_rsp->vdev_id = ev->vdev_id;
231*5113495bSYour Name 	vdev_rsp->requestor_id = ev->requestor_id;
232*5113495bSYour Name 	switch (ev->resp_type) {
233*5113495bSYour Name 	case WMI_VDEV_START_RESP_EVENT:
234*5113495bSYour Name 		vdev_rsp->resp_type = WMI_HOST_VDEV_START_RESP_EVENT;
235*5113495bSYour Name 		break;
236*5113495bSYour Name 	case WMI_VDEV_RESTART_RESP_EVENT:
237*5113495bSYour Name 		vdev_rsp->resp_type = WMI_HOST_VDEV_RESTART_RESP_EVENT;
238*5113495bSYour Name 		break;
239*5113495bSYour Name 	default:
240*5113495bSYour Name 		wmi_err("Invalid start response event buffer");
241*5113495bSYour Name 		break;
242*5113495bSYour Name 	};
243*5113495bSYour Name 	vdev_rsp->status = ev->status;
244*5113495bSYour Name 	vdev_rsp->chain_mask = ev->chain_mask;
245*5113495bSYour Name 	vdev_rsp->smps_mode = ev->smps_mode;
246*5113495bSYour Name 	vdev_rsp->mac_id = ev->mac_id;
247*5113495bSYour Name 	vdev_rsp->cfgd_tx_streams = ev->cfgd_tx_streams;
248*5113495bSYour Name 	vdev_rsp->cfgd_rx_streams = ev->cfgd_rx_streams;
249*5113495bSYour Name 	vdev_rsp->max_allowed_tx_power = ev->max_allowed_tx_power;
250*5113495bSYour Name 
251*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
252*5113495bSYour Name }
253*5113495bSYour Name 
254*5113495bSYour Name static QDF_STATUS
extract_vdev_delete_resp_tlv(struct wmi_unified * wmi_handle,void * evt_buf,struct vdev_delete_response * delete_rsp)255*5113495bSYour Name extract_vdev_delete_resp_tlv(struct wmi_unified *wmi_handle, void *evt_buf,
256*5113495bSYour Name 			     struct vdev_delete_response *delete_rsp)
257*5113495bSYour Name {
258*5113495bSYour Name 	WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *param_buf;
259*5113495bSYour Name 	wmi_vdev_delete_resp_event_fixed_param *ev;
260*5113495bSYour Name 
261*5113495bSYour Name 	param_buf = (WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *)evt_buf;
262*5113495bSYour Name 	if (!param_buf) {
263*5113495bSYour Name 		wmi_err("Invalid vdev delete response event buffer");
264*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
265*5113495bSYour Name 	}
266*5113495bSYour Name 
267*5113495bSYour Name 	ev = param_buf->fixed_param;
268*5113495bSYour Name 	if (!ev) {
269*5113495bSYour Name 		wmi_err("Invalid vdev delete response event");
270*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
271*5113495bSYour Name 	}
272*5113495bSYour Name 
273*5113495bSYour Name 	qdf_mem_zero(delete_rsp, sizeof(*delete_rsp));
274*5113495bSYour Name 	delete_rsp->vdev_id = ev->vdev_id;
275*5113495bSYour Name 
276*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
277*5113495bSYour Name }
278*5113495bSYour Name 
extract_vdev_peer_delete_all_response_event_tlv(wmi_unified_t wmi_hdl,void * evt_buf,struct peer_delete_all_response * param)279*5113495bSYour Name static QDF_STATUS extract_vdev_peer_delete_all_response_event_tlv(
280*5113495bSYour Name 		wmi_unified_t wmi_hdl,
281*5113495bSYour Name 		void *evt_buf,
282*5113495bSYour Name 		struct peer_delete_all_response *param)
283*5113495bSYour Name {
284*5113495bSYour Name 	WMI_VDEV_DELETE_ALL_PEER_RESP_EVENTID_param_tlvs *param_buf;
285*5113495bSYour Name 	wmi_vdev_delete_all_peer_resp_event_fixed_param *ev;
286*5113495bSYour Name 
287*5113495bSYour Name 	param_buf = (WMI_VDEV_DELETE_ALL_PEER_RESP_EVENTID_param_tlvs *)evt_buf;
288*5113495bSYour Name 
289*5113495bSYour Name 	ev = (wmi_vdev_delete_all_peer_resp_event_fixed_param *)
290*5113495bSYour Name 							param_buf->fixed_param;
291*5113495bSYour Name 	if (!ev) {
292*5113495bSYour Name 		wmi_err("Invalid peer_delete all response");
293*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
294*5113495bSYour Name 	}
295*5113495bSYour Name 
296*5113495bSYour Name 	param->vdev_id = ev->vdev_id;
297*5113495bSYour Name 	param->status = ev->status;
298*5113495bSYour Name 
299*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
300*5113495bSYour Name }
301*5113495bSYour Name 
302*5113495bSYour Name static QDF_STATUS
extract_vdev_stopped_param_tlv(struct wmi_unified * wmi_handle,void * evt_buf,uint32_t * vdev_id)303*5113495bSYour Name extract_vdev_stopped_param_tlv(struct wmi_unified *wmi_handle,
304*5113495bSYour Name 			       void *evt_buf, uint32_t *vdev_id)
305*5113495bSYour Name {
306*5113495bSYour Name 	WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
307*5113495bSYour Name 	wmi_vdev_stopped_event_fixed_param *resp_event;
308*5113495bSYour Name 
309*5113495bSYour Name 	param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *)evt_buf;
310*5113495bSYour Name 	if (!param_buf) {
311*5113495bSYour Name 		wmi_err("Invalid event buffer");
312*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
313*5113495bSYour Name 	}
314*5113495bSYour Name 	resp_event = param_buf->fixed_param;
315*5113495bSYour Name 	*vdev_id = resp_event->vdev_id;
316*5113495bSYour Name 
317*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
318*5113495bSYour Name }
319*5113495bSYour Name 
extract_ext_tbttoffset_num_vdevs_tlv(wmi_unified_t wmi_hdl,void * evt_buf,uint32_t * num_vdevs)320*5113495bSYour Name static QDF_STATUS extract_ext_tbttoffset_num_vdevs_tlv(
321*5113495bSYour Name 						wmi_unified_t wmi_hdl,
322*5113495bSYour Name 						void *evt_buf,
323*5113495bSYour Name 						uint32_t *num_vdevs)
324*5113495bSYour Name {
325*5113495bSYour Name 	WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *param_buf;
326*5113495bSYour Name 	wmi_tbtt_offset_ext_event_fixed_param *tbtt_offset_ext_event;
327*5113495bSYour Name 
328*5113495bSYour Name 	param_buf = (WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *)evt_buf;
329*5113495bSYour Name 	if (!param_buf) {
330*5113495bSYour Name 		wmi_err("Invalid tbtt update ext event buffer");
331*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
332*5113495bSYour Name 	}
333*5113495bSYour Name 	tbtt_offset_ext_event = param_buf->fixed_param;
334*5113495bSYour Name 
335*5113495bSYour Name 	*num_vdevs = tbtt_offset_ext_event->num_vdevs;
336*5113495bSYour Name 
337*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
338*5113495bSYour Name }
339*5113495bSYour Name 
extract_tbttoffset_update_params_tlv(wmi_unified_t wmi_hdl,void * evt_buf,uint8_t idx,struct tbttoffset_params * tbtt_param)340*5113495bSYour Name static QDF_STATUS extract_tbttoffset_update_params_tlv(
341*5113495bSYour Name 					wmi_unified_t wmi_hdl,
342*5113495bSYour Name 					void *evt_buf, uint8_t idx,
343*5113495bSYour Name 					struct tbttoffset_params *tbtt_param)
344*5113495bSYour Name {
345*5113495bSYour Name 	WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *param_buf;
346*5113495bSYour Name 	wmi_tbtt_offset_event_fixed_param *tbtt_offset_event;
347*5113495bSYour Name 	uint32_t vdev_map;
348*5113495bSYour Name 
349*5113495bSYour Name 	param_buf = (WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *)evt_buf;
350*5113495bSYour Name 	if (!param_buf) {
351*5113495bSYour Name 		wmi_err("Invalid tbtt update event buffer");
352*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
353*5113495bSYour Name 	}
354*5113495bSYour Name 
355*5113495bSYour Name 	tbtt_offset_event = param_buf->fixed_param;
356*5113495bSYour Name 	vdev_map = tbtt_offset_event->vdev_map;
357*5113495bSYour Name 	tbtt_param->vdev_id = wmi_vdev_map_to_vdev_id(vdev_map, idx);
358*5113495bSYour Name 	if (tbtt_param->vdev_id == WLAN_INVALID_VDEV_ID)
359*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
360*5113495bSYour Name 	tbtt_param->tbttoffset =
361*5113495bSYour Name 		param_buf->tbttoffset_list[tbtt_param->vdev_id];
362*5113495bSYour Name 	if (param_buf->tbtt_qtime_low_us_list)
363*5113495bSYour Name 		tbtt_param->vdev_tbtt_qtime_lo =
364*5113495bSYour Name 		    param_buf->tbtt_qtime_low_us_list[tbtt_param->vdev_id];
365*5113495bSYour Name 	if (param_buf->tbtt_qtime_high_us_list)
366*5113495bSYour Name 		tbtt_param->vdev_tbtt_qtime_hi =
367*5113495bSYour Name 		    param_buf->tbtt_qtime_high_us_list[tbtt_param->vdev_id];
368*5113495bSYour Name 
369*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
370*5113495bSYour Name }
371*5113495bSYour Name 
extract_ext_tbttoffset_update_params_tlv(wmi_unified_t wmi_hdl,void * evt_buf,uint8_t idx,struct tbttoffset_params * tbtt_param)372*5113495bSYour Name static QDF_STATUS extract_ext_tbttoffset_update_params_tlv(
373*5113495bSYour Name 					wmi_unified_t wmi_hdl,
374*5113495bSYour Name 					void *evt_buf, uint8_t idx,
375*5113495bSYour Name 					struct tbttoffset_params *tbtt_param)
376*5113495bSYour Name {
377*5113495bSYour Name 	WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *param_buf;
378*5113495bSYour Name 	wmi_tbtt_offset_info *tbtt_offset_info;
379*5113495bSYour Name 
380*5113495bSYour Name 	param_buf = (WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *)evt_buf;
381*5113495bSYour Name 	if (!param_buf) {
382*5113495bSYour Name 		wmi_err("Invalid tbtt update event buffer");
383*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
384*5113495bSYour Name 	}
385*5113495bSYour Name 	tbtt_offset_info = &param_buf->tbtt_offset_info[idx];
386*5113495bSYour Name 
387*5113495bSYour Name 	tbtt_param->vdev_id = tbtt_offset_info->vdev_id;
388*5113495bSYour Name 	tbtt_param->tbttoffset = tbtt_offset_info->tbttoffset;
389*5113495bSYour Name 	tbtt_param->vdev_tbtt_qtime_lo = tbtt_offset_info->tbtt_qtime_low_us;
390*5113495bSYour Name 	tbtt_param->vdev_tbtt_qtime_hi = tbtt_offset_info->tbtt_qtime_high_us;
391*5113495bSYour Name 
392*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
393*5113495bSYour Name }
394*5113495bSYour Name 
extract_muedca_params_tlv(wmi_unified_t wmi_hdl,void * evt_buf,struct muedca_params * muedca_param_list)395*5113495bSYour Name static QDF_STATUS extract_muedca_params_tlv(wmi_unified_t wmi_hdl,
396*5113495bSYour Name 					    void *evt_buf,
397*5113495bSYour Name 					    struct muedca_params *muedca_param_list)
398*5113495bSYour Name {
399*5113495bSYour Name 	WMI_MUEDCA_PARAMS_CONFIG_EVENTID_param_tlvs *param_buf;
400*5113495bSYour Name 	wmi_muedca_params_config_event_fixed_param *muedca_param;
401*5113495bSYour Name 	int i;
402*5113495bSYour Name 
403*5113495bSYour Name 	param_buf = (WMI_MUEDCA_PARAMS_CONFIG_EVENTID_param_tlvs *)evt_buf;
404*5113495bSYour Name 	if (!param_buf) {
405*5113495bSYour Name 		wmi_err("Invalid muedca evt buffer");
406*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
407*5113495bSYour Name 	}
408*5113495bSYour Name 	muedca_param = param_buf->fixed_param;
409*5113495bSYour Name 
410*5113495bSYour Name 	muedca_param_list->pdev_id = wmi_hdl->ops->
411*5113495bSYour Name 		convert_target_pdev_id_to_host(wmi_hdl,
412*5113495bSYour Name 					       muedca_param->pdev_id);
413*5113495bSYour Name 	for (i = 0; i < WMI_AC_MAX; i++) {
414*5113495bSYour Name 		muedca_param_list->muedca_aifsn[i] = muedca_param->aifsn[i] &
415*5113495bSYour Name 						      WMI_MUEDCA_PARAM_MASK;
416*5113495bSYour Name 		muedca_param_list->muedca_ecwmin[i] = muedca_param->ecwmin[i] &
417*5113495bSYour Name 						      WMI_MUEDCA_PARAM_MASK;
418*5113495bSYour Name 		muedca_param_list->muedca_ecwmax[i] = muedca_param->ecwmax[i] &
419*5113495bSYour Name 						      WMI_MUEDCA_PARAM_MASK;
420*5113495bSYour Name 		muedca_param_list->muedca_timer[i] = muedca_param->muedca_expiration_time[i] &
421*5113495bSYour Name 						      WMI_MUEDCA_PARAM_MASK;
422*5113495bSYour Name 	}
423*5113495bSYour Name 
424*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
425*5113495bSYour Name }
426*5113495bSYour Name 
427*5113495bSYour Name #ifdef WLAN_FEATURE_SR
428*5113495bSYour Name static QDF_STATUS
vdev_param_sr_prohibit_send_tlv(struct wmi_unified * wmi_handle,struct sr_prohibit_param * param)429*5113495bSYour Name vdev_param_sr_prohibit_send_tlv(struct wmi_unified *wmi_handle,
430*5113495bSYour Name 				struct sr_prohibit_param *param)
431*5113495bSYour Name {
432*5113495bSYour Name 	wmi_vdev_param_enable_sr_prohibit_fixed_param *cmd;
433*5113495bSYour Name 	wmi_buf_t buf;
434*5113495bSYour Name 	int32_t len = sizeof(*cmd);
435*5113495bSYour Name 
436*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
437*5113495bSYour Name 	if (!buf) {
438*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
439*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
440*5113495bSYour Name 	}
441*5113495bSYour Name 	cmd = (wmi_vdev_param_enable_sr_prohibit_fixed_param *)
442*5113495bSYour Name 	      wmi_buf_data(buf);
443*5113495bSYour Name 	WMITLV_SET_HDR
444*5113495bSYour Name 		(&cmd->tlv_header,
445*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_vdev_param_enable_sr_prohibit_fixed_param,
446*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
447*5113495bSYour Name 		(wmi_vdev_param_enable_sr_prohibit_fixed_param));
448*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
449*5113495bSYour Name 	cmd->tidmap = 0;
450*5113495bSYour Name 	cmd->prohibit_enable = param->sr_he_siga_val15_allowed;
451*5113495bSYour Name 	wmi_debug("SR Prohibit enabled: %d", cmd->prohibit_enable);
452*5113495bSYour Name 
453*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_PARAM_ENABLE_SR_PROHIBIT_CMDID, cmd->vdev_id, 0);
454*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
455*5113495bSYour Name 				 WMI_VDEV_PARAM_ENABLE_SR_PROHIBIT_CMDID)) {
456*5113495bSYour Name 		wmi_err("Failed to set neighbour rx param");
457*5113495bSYour Name 		wmi_buf_free(buf);
458*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
459*5113495bSYour Name 	}
460*5113495bSYour Name 
461*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
462*5113495bSYour Name }
463*5113495bSYour Name 
wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops * wmi_ops)464*5113495bSYour Name static void wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops *wmi_ops)
465*5113495bSYour Name {
466*5113495bSYour Name 	if (!wmi_ops)
467*5113495bSYour Name 		return;
468*5113495bSYour Name 
469*5113495bSYour Name 	wmi_ops->vdev_param_sr_prohibit_send =
470*5113495bSYour Name 				vdev_param_sr_prohibit_send_tlv;
471*5113495bSYour Name }
472*5113495bSYour Name #else
wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops * wmi_ops)473*5113495bSYour Name static inline void wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops *wmi_ops)
474*5113495bSYour Name {
475*5113495bSYour Name }
476*5113495bSYour Name #endif
477*5113495bSYour Name 
478*5113495bSYour Name static void
set_peer_tx_vlan_config(wmi_peer_config_vlan_cmd_fixed_param * cmd,struct peer_vlan_config_param * cfg)479*5113495bSYour Name set_peer_tx_vlan_config(wmi_peer_config_vlan_cmd_fixed_param *cmd,
480*5113495bSYour Name 			struct peer_vlan_config_param *cfg)
481*5113495bSYour Name {
482*5113495bSYour Name 	WMI_VLAN_TX_SET(cmd->peer_vlan_config_mask, cfg->tx_cmd);
483*5113495bSYour Name 
484*5113495bSYour Name 	/* Setting insert_or_strip bit for Tx */
485*5113495bSYour Name 	WMI_TX_INSERT_OR_STRIP_SET(cmd->peer_vlan_config_mask,
486*5113495bSYour Name 				   cfg->tx_strip_insert);
487*5113495bSYour Name 
488*5113495bSYour Name 	if (cfg->tx_strip_insert_inner && cfg->tx_strip_insert) {
489*5113495bSYour Name 	/* Setting the strip_insert_vlan_inner bit fo Tx */
490*5113495bSYour Name 		WMI_TX_STRIP_INSERT_VLAN_INNER_SET(cmd->peer_vlan_config_mask,
491*5113495bSYour Name 						   cfg->tx_strip_insert_inner);
492*5113495bSYour Name 	/* If Insert inner tag bit is set, then fill inner_tci */
493*5113495bSYour Name 		WMI_TX_INSERT_VLAN_INNER_TCI_SET(cmd->insert_vlan_tci,
494*5113495bSYour Name 						 cfg->insert_vlan_inner_tci);
495*5113495bSYour Name 	}
496*5113495bSYour Name 
497*5113495bSYour Name 	if (cfg->tx_strip_insert_outer && cfg->tx_strip_insert) {
498*5113495bSYour Name 		/* Setting the strip_insert_vlan_outer bit for Tx */
499*5113495bSYour Name 		WMI_TX_STRIP_INSERT_VLAN_OUTER_SET(cmd->peer_vlan_config_mask,
500*5113495bSYour Name 						   cfg->tx_strip_insert_outer);
501*5113495bSYour Name 		/* If Insert outer tag bit is set, then fill outer_tci */
502*5113495bSYour Name 		WMI_TX_INSERT_VLAN_OUTER_TCI_SET(cmd->insert_vlan_tci,
503*5113495bSYour Name 						 cfg->insert_vlan_outer_tci);
504*5113495bSYour Name 	}
505*5113495bSYour Name }
506*5113495bSYour Name 
507*5113495bSYour Name static void
wmi_set_peer_vlan_config(wmi_peer_config_vlan_cmd_fixed_param * cmd,struct peer_vlan_config_param * param)508*5113495bSYour Name wmi_set_peer_vlan_config(wmi_peer_config_vlan_cmd_fixed_param *cmd,
509*5113495bSYour Name 			 struct peer_vlan_config_param *param)
510*5113495bSYour Name {
511*5113495bSYour Name 	/* Tx command - Check if cmd is Tx then configure Tx cmd */
512*5113495bSYour Name 	if (param->tx_cmd)
513*5113495bSYour Name 		set_peer_tx_vlan_config(cmd, param);
514*5113495bSYour Name 
515*5113495bSYour Name 	/* Rx command - Check if cmd is Rx then configure Rx cmd */
516*5113495bSYour Name 	if (param->rx_cmd) {
517*5113495bSYour Name 		WMI_VLAN_RX_SET(cmd->peer_vlan_config_mask, param->rx_cmd);
518*5113495bSYour Name 
519*5113495bSYour Name 		/* Setting the strip_vlan_c_tag_decap bit in RX */
520*5113495bSYour Name 		WMI_RX_STRIP_VLAN_C_TAG_SET(cmd->peer_vlan_config_mask,
521*5113495bSYour Name 					    param->rx_strip_c_tag);
522*5113495bSYour Name 
523*5113495bSYour Name 		/* Setting the strip_vlan_s_tag_decap bit in RX */
524*5113495bSYour Name 		WMI_RX_STRIP_VLAN_S_TAG_SET(cmd->peer_vlan_config_mask,
525*5113495bSYour Name 					    param->rx_strip_s_tag);
526*5113495bSYour Name 
527*5113495bSYour Name 		/* Setting the insert_vlan_c_tag_decap bit in RX */
528*5113495bSYour Name 		WMI_RX_INSERT_VLAN_C_TAG_SET(cmd->peer_vlan_config_mask,
529*5113495bSYour Name 					     param->rx_insert_c_tag);
530*5113495bSYour Name 
531*5113495bSYour Name 		/* Setting the insert_vlan_s_tag_decap bit in RX */
532*5113495bSYour Name 		WMI_RX_INSERT_VLAN_S_TAG_SET(cmd->peer_vlan_config_mask,
533*5113495bSYour Name 					     param->rx_insert_s_tag);
534*5113495bSYour Name 	}
535*5113495bSYour Name }
536*5113495bSYour Name 
537*5113495bSYour Name static QDF_STATUS
send_peer_vlan_config_cmd_tlv(wmi_unified_t wmi,uint8_t peer_addr[QDF_MAC_ADDR_SIZE],struct peer_vlan_config_param * param)538*5113495bSYour Name send_peer_vlan_config_cmd_tlv(wmi_unified_t wmi,
539*5113495bSYour Name 			      uint8_t peer_addr[QDF_MAC_ADDR_SIZE],
540*5113495bSYour Name 			      struct peer_vlan_config_param *param)
541*5113495bSYour Name {
542*5113495bSYour Name 	wmi_peer_config_vlan_cmd_fixed_param *cmd;
543*5113495bSYour Name 	wmi_buf_t buf;
544*5113495bSYour Name 	uint32_t len = sizeof(*cmd);
545*5113495bSYour Name 
546*5113495bSYour Name 	buf = wmi_buf_alloc(wmi, len);
547*5113495bSYour Name 	if (!buf)
548*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
549*5113495bSYour Name 
550*5113495bSYour Name 	cmd = (wmi_peer_config_vlan_cmd_fixed_param *)wmi_buf_data(buf);
551*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
552*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_peer_config_vlan_cmd_fixed_param,
553*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
554*5113495bSYour Name 			       (wmi_peer_config_vlan_cmd_fixed_param));
555*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_addr, &cmd->peer_macaddr);
556*5113495bSYour Name 
557*5113495bSYour Name 	/* vdev id */
558*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
559*5113495bSYour Name 
560*5113495bSYour Name 	wmi_set_peer_vlan_config(cmd, param);
561*5113495bSYour Name 
562*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi, buf, len, WMI_PEER_CONFIG_VLAN_CMDID)) {
563*5113495bSYour Name 		wmi_err("Failed to send peer hw vlan acceleration command");
564*5113495bSYour Name 		wmi_buf_free(buf);
565*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
566*5113495bSYour Name 	}
567*5113495bSYour Name 
568*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
569*5113495bSYour Name }
570*5113495bSYour Name 
wmi_vdev_attach_tlv(struct wmi_unified * wmi_handle)571*5113495bSYour Name void wmi_vdev_attach_tlv(struct wmi_unified *wmi_handle)
572*5113495bSYour Name {
573*5113495bSYour Name 	struct wmi_ops *wmi_ops;
574*5113495bSYour Name 
575*5113495bSYour Name 	if (!wmi_handle) {
576*5113495bSYour Name 		wmi_err("null wmi handle");
577*5113495bSYour Name 		return;
578*5113495bSYour Name 	}
579*5113495bSYour Name 
580*5113495bSYour Name 	wmi_ops = wmi_handle->ops;
581*5113495bSYour Name 	wmi_ops->extract_vdev_delete_resp = extract_vdev_delete_resp_tlv;
582*5113495bSYour Name 	wmi_ops->extract_vdev_stopped_param = extract_vdev_stopped_param_tlv;
583*5113495bSYour Name 	wmi_ops->extract_vdev_start_resp = extract_vdev_start_resp_tlv;
584*5113495bSYour Name 	wmi_ops->extract_vdev_peer_delete_all_response_event =
585*5113495bSYour Name 				extract_vdev_peer_delete_all_response_event_tlv;
586*5113495bSYour Name 	wmi_ops->extract_tbttoffset_num_vdevs =
587*5113495bSYour Name 				extract_tbttoffset_num_vdevs_tlv;
588*5113495bSYour Name 	wmi_ops->extract_tbttoffset_update_params =
589*5113495bSYour Name 				extract_tbttoffset_update_params_tlv;
590*5113495bSYour Name 	wmi_ops->extract_ext_tbttoffset_update_params =
591*5113495bSYour Name 				extract_ext_tbttoffset_update_params_tlv;
592*5113495bSYour Name 	wmi_ops->extract_ext_tbttoffset_num_vdevs =
593*5113495bSYour Name 				extract_ext_tbttoffset_num_vdevs_tlv;
594*5113495bSYour Name 	wmi_ops->extract_muedca_params_handler =
595*5113495bSYour Name 				extract_muedca_params_tlv;
596*5113495bSYour Name 	wmi_ops->send_vdev_set_neighbour_rx_cmd =
597*5113495bSYour Name 				send_vdev_set_neighbour_rx_cmd_tlv;
598*5113495bSYour Name 	wmi_ops->send_beacon_send_cmd = send_beacon_send_cmd_tlv;
599*5113495bSYour Name 	wmi_ops->send_vdev_config_ratemask_cmd =
600*5113495bSYour Name 				send_vdev_config_ratemask_cmd_tlv;
601*5113495bSYour Name 	wmi_ops->send_peer_filter_set_tx_cmd = send_peer_filter_set_tx_cmd_tlv;
602*5113495bSYour Name 	wmi_ops->send_peer_vlan_config_cmd = send_peer_vlan_config_cmd_tlv;
603*5113495bSYour Name 	wmi_vdev_attach_sr_cmds_tlv(wmi_ops);
604*5113495bSYour Name }
605