xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_interop_issues_ap_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 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 <wmi.h>
22*5113495bSYour Name #include <wmi_unified_priv.h>
23*5113495bSYour Name #include <wmi_unified_interop_issues_ap_api.h>
24*5113495bSYour Name 
25*5113495bSYour Name /**
26*5113495bSYour Name  * extract_interop_issues_ap_ev_param_tlv() - extract info from event
27*5113495bSYour Name  * @wmi_handle: wmi handle
28*5113495bSYour Name  * @evt_buf: pointer to event buffer
29*5113495bSYour Name  * @data: Pointer to hold interop issues ap info
30*5113495bSYour Name  *
31*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
32*5113495bSYour Name  */
33*5113495bSYour Name static QDF_STATUS
extract_interop_issues_ap_ev_param_tlv(wmi_unified_t wmi_handle,void * evt_buf,struct wlan_interop_issues_ap_event * data)34*5113495bSYour Name extract_interop_issues_ap_ev_param_tlv(wmi_unified_t wmi_handle, void *evt_buf,
35*5113495bSYour Name 				     struct wlan_interop_issues_ap_event *data)
36*5113495bSYour Name {
37*5113495bSYour Name 	wmi_pdev_rap_info_event_fixed_param *fixed_param;
38*5113495bSYour Name 	WMI_PDEV_RAP_INFO_EVENTID_param_tlvs *param_buf =
39*5113495bSYour Name 		(WMI_PDEV_RAP_INFO_EVENTID_param_tlvs *)evt_buf;
40*5113495bSYour Name 
41*5113495bSYour Name 	if (!param_buf) {
42*5113495bSYour Name 		wmi_err_rl("Invalid param_buf");
43*5113495bSYour Name 		return -EINVAL;
44*5113495bSYour Name 	}
45*5113495bSYour Name 
46*5113495bSYour Name 	fixed_param = param_buf->fixed_param;
47*5113495bSYour Name 	if (!fixed_param) {
48*5113495bSYour Name 		wmi_err_rl("Invalid fixed_praram");
49*5113495bSYour Name 		return -EINVAL;
50*5113495bSYour Name 	}
51*5113495bSYour Name 
52*5113495bSYour Name 	if (fixed_param->type != WMI_ROGUE_AP_ON_STA_PS) {
53*5113495bSYour Name 		wmi_err_rl("Invalid type");
54*5113495bSYour Name 		return -EINVAL;
55*5113495bSYour Name 	}
56*5113495bSYour Name 
57*5113495bSYour Name 	data->pdev_id = fixed_param->pdev_id;
58*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_param->bssid, data->rap_addr.bytes);
59*5113495bSYour Name 
60*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
61*5113495bSYour Name }
62*5113495bSYour Name 
63*5113495bSYour Name /**
64*5113495bSYour Name  * send_set_rap_ps_cmd_tlv() - set interop issues ap mac address in fw
65*5113495bSYour Name  * @wmi_handle: wmi handle
66*5113495bSYour Name  * @rap: interop issues ap info
67*5113495bSYour Name  *
68*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
69*5113495bSYour Name  */
70*5113495bSYour Name static QDF_STATUS
send_set_rap_ps_cmd_tlv(wmi_unified_t wmi_handle,struct wlan_interop_issues_ap_info * rap)71*5113495bSYour Name send_set_rap_ps_cmd_tlv(wmi_unified_t wmi_handle,
72*5113495bSYour Name 			struct wlan_interop_issues_ap_info *rap)
73*5113495bSYour Name {
74*5113495bSYour Name 	wmi_pdev_set_rap_config_fixed_param *cmd;
75*5113495bSYour Name 	wmi_pdev_set_rap_config_on_sta_ps_tlv_param *param;
76*5113495bSYour Name 	uint8_t *buf_ptr;
77*5113495bSYour Name 	wmi_buf_t buf;
78*5113495bSYour Name 	uint32_t ret;
79*5113495bSYour Name 	uint32_t len, count;
80*5113495bSYour Name 	qdf_size_t i;
81*5113495bSYour Name 
82*5113495bSYour Name 	count = rap->count;
83*5113495bSYour Name 	len  = sizeof(*cmd) + WMI_TLV_HDR_SIZE + sizeof(*param) * count;
84*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
85*5113495bSYour Name 	if (!buf)
86*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
87*5113495bSYour Name 
88*5113495bSYour Name 	buf_ptr = wmi_buf_data(buf);
89*5113495bSYour Name 	cmd = (wmi_pdev_set_rap_config_fixed_param *)buf_ptr;
90*5113495bSYour Name 
91*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
92*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_pdev_set_rap_config_fixed_param,
93*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
94*5113495bSYour Name 			       (wmi_pdev_set_rap_config_fixed_param));
95*5113495bSYour Name 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
96*5113495bSYour Name 						     wmi_handle,
97*5113495bSYour Name 						     WMI_HOST_PDEV_ID_SOC);
98*5113495bSYour Name 
99*5113495bSYour Name 	cmd->type = WMI_ROGUE_AP_ON_STA_PS;
100*5113495bSYour Name 	if (rap->detect_enable)
101*5113495bSYour Name 		cmd->sta_ps_detection_enabled = 1;
102*5113495bSYour Name 	else
103*5113495bSYour Name 		cmd->sta_ps_detection_enabled = 0;
104*5113495bSYour Name 
105*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
106*5113495bSYour Name 
107*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
108*5113495bSYour Name 		  sizeof(wmi_pdev_set_rap_config_on_sta_ps_tlv_param) * count);
109*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
110*5113495bSYour Name 
111*5113495bSYour Name 	for (i = 0; i < count; i++) {
112*5113495bSYour Name 		param = (wmi_pdev_set_rap_config_on_sta_ps_tlv_param *)buf_ptr;
113*5113495bSYour Name 		WMITLV_SET_HDR(&param->tlv_header,
114*5113495bSYour Name 		  WMITLV_TAG_STRUC_wmi_pdev_set_rap_config_on_sta_ps_tlv_param,
115*5113495bSYour Name 		  WMITLV_GET_STRUCT_TLVLEN
116*5113495bSYour Name 				(wmi_pdev_set_rap_config_on_sta_ps_tlv_param));
117*5113495bSYour Name 		WMI_CHAR_ARRAY_TO_MAC_ADDR(rap->rap_items[i].bytes,
118*5113495bSYour Name 					   &param->bssid);
119*5113495bSYour Name 		buf_ptr += sizeof(*param);
120*5113495bSYour Name 	}
121*5113495bSYour Name 
122*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
123*5113495bSYour Name 				   WMI_PDEV_SET_RAP_CONFIG_CMDID);
124*5113495bSYour Name 	if (ret) {
125*5113495bSYour Name 		wmi_buf_free(buf);
126*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
127*5113495bSYour Name 	}
128*5113495bSYour Name 
129*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
130*5113495bSYour Name }
131*5113495bSYour Name 
wmi_interop_issues_ap_attach_tlv(wmi_unified_t wmi_handle)132*5113495bSYour Name void wmi_interop_issues_ap_attach_tlv(wmi_unified_t wmi_handle)
133*5113495bSYour Name {
134*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
135*5113495bSYour Name 
136*5113495bSYour Name 	ops->extract_interop_issues_ap_ev_param =
137*5113495bSYour Name 					extract_interop_issues_ap_ev_param_tlv;
138*5113495bSYour Name 	ops->send_set_rap_ps_cmd = send_set_rap_ps_cmd_tlv;
139*5113495bSYour Name }
140