xref: /wlan-driver/qcacld-3.0/components/target_if/pmo/src/target_if_pmo_lphb.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-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  * DOC: target_if_pmo_lphb.c
21*5113495bSYour Name  *
22*5113495bSYour Name  * Target interface file for pmo component to
23*5113495bSYour Name  * send lphb offload related cmd and process event.
24*5113495bSYour Name  */
25*5113495bSYour Name #ifdef FEATURE_WLAN_LPHB
26*5113495bSYour Name 
27*5113495bSYour Name #include "target_if.h"
28*5113495bSYour Name #include "target_if_pmo.h"
29*5113495bSYour Name #include "wmi_unified_pmo_api.h"
30*5113495bSYour Name 
target_if_pmo_send_lphb_enable(struct wlan_objmgr_psoc * psoc,struct pmo_lphb_enable_req * ts_lphb_enable)31*5113495bSYour Name QDF_STATUS target_if_pmo_send_lphb_enable(struct wlan_objmgr_psoc *psoc,
32*5113495bSYour Name 			struct pmo_lphb_enable_req *ts_lphb_enable)
33*5113495bSYour Name {
34*5113495bSYour Name 	wmi_hb_set_enable_cmd_fixed_param hb_enable_fp;
35*5113495bSYour Name 	wmi_unified_t wmi_handle;
36*5113495bSYour Name 
37*5113495bSYour Name 	if (!ts_lphb_enable) {
38*5113495bSYour Name 		target_if_err("LPHB Enable configuration is NULL");
39*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
40*5113495bSYour Name 	}
41*5113495bSYour Name 
42*5113495bSYour Name 	target_if_info("PMO_HB_SET_ENABLE enable=%d, item=%d, session=%d",
43*5113495bSYour Name 		ts_lphb_enable->enable,
44*5113495bSYour Name 		ts_lphb_enable->item, ts_lphb_enable->session);
45*5113495bSYour Name 
46*5113495bSYour Name 	if ((ts_lphb_enable->item != 1) && (ts_lphb_enable->item != 2)) {
47*5113495bSYour Name 		target_if_err("LPHB configuration wrong item %d",
48*5113495bSYour Name 			ts_lphb_enable->item);
49*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
50*5113495bSYour Name 	}
51*5113495bSYour Name 
52*5113495bSYour Name 	/* fill in values */
53*5113495bSYour Name 	hb_enable_fp.vdev_id = ts_lphb_enable->session;
54*5113495bSYour Name 	hb_enable_fp.enable = ts_lphb_enable->enable;
55*5113495bSYour Name 	hb_enable_fp.item = ts_lphb_enable->item;
56*5113495bSYour Name 	hb_enable_fp.session = ts_lphb_enable->session;
57*5113495bSYour Name 
58*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
59*5113495bSYour Name 	if (!wmi_handle) {
60*5113495bSYour Name 		target_if_err("Invalid wmi handle");
61*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
62*5113495bSYour Name 	}
63*5113495bSYour Name 
64*5113495bSYour Name 	return wmi_unified_lphb_config_hbenable_cmd(wmi_handle, &hb_enable_fp);
65*5113495bSYour Name }
66*5113495bSYour Name 
target_if_pmo_send_lphb_tcp_params(struct wlan_objmgr_psoc * psoc,struct pmo_lphb_tcp_params * ts_lphb_tcp_param)67*5113495bSYour Name QDF_STATUS target_if_pmo_send_lphb_tcp_params(struct wlan_objmgr_psoc *psoc,
68*5113495bSYour Name 			struct pmo_lphb_tcp_params *ts_lphb_tcp_param)
69*5113495bSYour Name {
70*5113495bSYour Name 	wmi_hb_set_tcp_params_cmd_fixed_param hb_tcp_params_fp = {0};
71*5113495bSYour Name 	wmi_unified_t wmi_handle;
72*5113495bSYour Name 
73*5113495bSYour Name 	if (!ts_lphb_tcp_param) {
74*5113495bSYour Name 		target_if_err("TCP params LPHB configuration is NULL");
75*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
76*5113495bSYour Name 	}
77*5113495bSYour Name 
78*5113495bSYour Name 	target_if_info("PMO --> WMI_HB_SET_TCP_PARAMS srv_ip=%08x, "
79*5113495bSYour Name 		"dev_ip=%08x, src_port=%d, dst_port=%d, timeout=%d, "
80*5113495bSYour Name 		"session=%d, gateway_mac= "QDF_MAC_ADDR_FMT", time_period_sec=%d,"
81*5113495bSYour Name 		"tcp_sn=%d", ts_lphb_tcp_param->srv_ip,
82*5113495bSYour Name 		ts_lphb_tcp_param->dev_ip, ts_lphb_tcp_param->src_port,
83*5113495bSYour Name 		ts_lphb_tcp_param->dst_port, ts_lphb_tcp_param->timeout,
84*5113495bSYour Name 		ts_lphb_tcp_param->session,
85*5113495bSYour Name 		QDF_MAC_ADDR_REF(ts_lphb_tcp_param->gateway_mac.bytes),
86*5113495bSYour Name 		ts_lphb_tcp_param->time_period_sec, ts_lphb_tcp_param->tcp_sn);
87*5113495bSYour Name 
88*5113495bSYour Name 	/* fill in values */
89*5113495bSYour Name 	hb_tcp_params_fp.vdev_id = ts_lphb_tcp_param->session;
90*5113495bSYour Name 	hb_tcp_params_fp.srv_ip = ts_lphb_tcp_param->srv_ip;
91*5113495bSYour Name 	hb_tcp_params_fp.dev_ip = ts_lphb_tcp_param->dev_ip;
92*5113495bSYour Name 	hb_tcp_params_fp.seq = ts_lphb_tcp_param->tcp_sn;
93*5113495bSYour Name 	hb_tcp_params_fp.src_port = ts_lphb_tcp_param->src_port;
94*5113495bSYour Name 	hb_tcp_params_fp.dst_port = ts_lphb_tcp_param->dst_port;
95*5113495bSYour Name 	hb_tcp_params_fp.interval = ts_lphb_tcp_param->time_period_sec;
96*5113495bSYour Name 	hb_tcp_params_fp.timeout = ts_lphb_tcp_param->timeout;
97*5113495bSYour Name 	hb_tcp_params_fp.session = ts_lphb_tcp_param->session;
98*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(ts_lphb_tcp_param->gateway_mac.bytes,
99*5113495bSYour Name 				   &hb_tcp_params_fp.gateway_mac);
100*5113495bSYour Name 
101*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
102*5113495bSYour Name 	if (!wmi_handle) {
103*5113495bSYour Name 		target_if_err("Invalid wmi handle");
104*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
105*5113495bSYour Name 	}
106*5113495bSYour Name 
107*5113495bSYour Name 	return wmi_unified_lphb_config_tcp_params_cmd(wmi_handle,
108*5113495bSYour Name 						      &hb_tcp_params_fp);
109*5113495bSYour Name }
110*5113495bSYour Name 
target_if_pmo_send_lphb_tcp_pkt_filter(struct wlan_objmgr_psoc * psoc,struct pmo_lphb_tcp_filter_req * ts_lphb_tcp_filter)111*5113495bSYour Name QDF_STATUS target_if_pmo_send_lphb_tcp_pkt_filter(struct wlan_objmgr_psoc *psoc,
112*5113495bSYour Name 			struct pmo_lphb_tcp_filter_req *ts_lphb_tcp_filter)
113*5113495bSYour Name {
114*5113495bSYour Name 	wmi_hb_set_tcp_pkt_filter_cmd_fixed_param hb_tcp_filter_fp = {0};
115*5113495bSYour Name 	wmi_unified_t wmi_handle;
116*5113495bSYour Name 
117*5113495bSYour Name 	if (!ts_lphb_tcp_filter) {
118*5113495bSYour Name 		target_if_err("TCP PKT FILTER LPHB configuration is NULL");
119*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
120*5113495bSYour Name 	}
121*5113495bSYour Name 
122*5113495bSYour Name 	target_if_info("SET_TCP_PKT_FILTER length=%d, offset=%d, session=%d, "
123*5113495bSYour Name 		"filter=%2x:%2x:%2x:%2x:%2x:%2x ...",
124*5113495bSYour Name 		ts_lphb_tcp_filter->length, ts_lphb_tcp_filter->offset,
125*5113495bSYour Name 		ts_lphb_tcp_filter->session, ts_lphb_tcp_filter->filter[0],
126*5113495bSYour Name 		ts_lphb_tcp_filter->filter[1], ts_lphb_tcp_filter->filter[2],
127*5113495bSYour Name 		ts_lphb_tcp_filter->filter[3], ts_lphb_tcp_filter->filter[4],
128*5113495bSYour Name 		ts_lphb_tcp_filter->filter[5]);
129*5113495bSYour Name 
130*5113495bSYour Name 	/* fill in values */
131*5113495bSYour Name 	hb_tcp_filter_fp.vdev_id = ts_lphb_tcp_filter->session;
132*5113495bSYour Name 	hb_tcp_filter_fp.length = ts_lphb_tcp_filter->length;
133*5113495bSYour Name 	hb_tcp_filter_fp.offset = ts_lphb_tcp_filter->offset;
134*5113495bSYour Name 	hb_tcp_filter_fp.session = ts_lphb_tcp_filter->session;
135*5113495bSYour Name 	memcpy((void *)&hb_tcp_filter_fp.filter,
136*5113495bSYour Name 	       (void *)&ts_lphb_tcp_filter->filter,
137*5113495bSYour Name 	       WMI_WLAN_HB_MAX_FILTER_SIZE);
138*5113495bSYour Name 
139*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
140*5113495bSYour Name 	if (!wmi_handle) {
141*5113495bSYour Name 		target_if_err("Invalid wmi handle");
142*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
143*5113495bSYour Name 	}
144*5113495bSYour Name 
145*5113495bSYour Name 	return wmi_unified_lphb_config_tcp_pkt_filter_cmd(wmi_handle,
146*5113495bSYour Name 							  &hb_tcp_filter_fp);
147*5113495bSYour Name }
148*5113495bSYour Name 
target_if_pmo_send_lphb_udp_params(struct wlan_objmgr_psoc * psoc,struct pmo_lphb_udp_params * ts_lphb_udp_param)149*5113495bSYour Name QDF_STATUS target_if_pmo_send_lphb_udp_params(struct wlan_objmgr_psoc *psoc,
150*5113495bSYour Name 			struct pmo_lphb_udp_params *ts_lphb_udp_param)
151*5113495bSYour Name {
152*5113495bSYour Name 	wmi_hb_set_udp_params_cmd_fixed_param hb_udp_params_fp = {0};
153*5113495bSYour Name 	wmi_unified_t wmi_handle;
154*5113495bSYour Name 
155*5113495bSYour Name 	if (!ts_lphb_udp_param) {
156*5113495bSYour Name 		target_if_err("UDP param for LPHB configuration is NULL");
157*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	target_if_info("HB_SET_UDP_PARAMS srv_ip=%d, dev_ip=%d, src_port=%d, "
161*5113495bSYour Name 		"dst_port=%d, interval=%d, timeout=%d, session=%d, "
162*5113495bSYour Name 		"gateway_mac= "QDF_MAC_ADDR_FMT,
163*5113495bSYour Name 		ts_lphb_udp_param->srv_ip, ts_lphb_udp_param->dev_ip,
164*5113495bSYour Name 		ts_lphb_udp_param->src_port, ts_lphb_udp_param->dst_port,
165*5113495bSYour Name 		ts_lphb_udp_param->interval, ts_lphb_udp_param->timeout,
166*5113495bSYour Name 		ts_lphb_udp_param->session,
167*5113495bSYour Name 		QDF_MAC_ADDR_REF(ts_lphb_udp_param->gateway_mac.bytes));
168*5113495bSYour Name 
169*5113495bSYour Name 	/* fill in values */
170*5113495bSYour Name 	hb_udp_params_fp.vdev_id = ts_lphb_udp_param->session;
171*5113495bSYour Name 	hb_udp_params_fp.srv_ip = ts_lphb_udp_param->srv_ip;
172*5113495bSYour Name 	hb_udp_params_fp.dev_ip = ts_lphb_udp_param->dev_ip;
173*5113495bSYour Name 	hb_udp_params_fp.src_port = ts_lphb_udp_param->src_port;
174*5113495bSYour Name 	hb_udp_params_fp.dst_port = ts_lphb_udp_param->dst_port;
175*5113495bSYour Name 	hb_udp_params_fp.interval = ts_lphb_udp_param->interval;
176*5113495bSYour Name 	hb_udp_params_fp.timeout = ts_lphb_udp_param->timeout;
177*5113495bSYour Name 	hb_udp_params_fp.session = ts_lphb_udp_param->session;
178*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(ts_lphb_udp_param->gateway_mac.bytes,
179*5113495bSYour Name 				   &hb_udp_params_fp.gateway_mac);
180*5113495bSYour Name 
181*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
182*5113495bSYour Name 	if (!wmi_handle) {
183*5113495bSYour Name 		target_if_err("Invalid wmi handle");
184*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
185*5113495bSYour Name 	}
186*5113495bSYour Name 
187*5113495bSYour Name 	return wmi_unified_lphb_config_udp_params_cmd(wmi_handle,
188*5113495bSYour Name 						      &hb_udp_params_fp);
189*5113495bSYour Name }
190*5113495bSYour Name 
191*5113495bSYour Name /**
192*5113495bSYour Name  * target_if_pmo_send_lphb_udp_pkt_filter() - Send LPHB udp pkt filter req
193*5113495bSYour Name  * @psoc: objmgr psoc handle
194*5113495bSYour Name  * @ts_lphb_udp_filter: lphb udp filter request which needs to configure in fwr
195*5113495bSYour Name  *
196*5113495bSYour Name  * Return: QDF status
197*5113495bSYour Name  */
target_if_pmo_send_lphb_udp_pkt_filter(struct wlan_objmgr_psoc * psoc,struct pmo_lphb_udp_filter_req * ts_lphb_udp_filter)198*5113495bSYour Name QDF_STATUS target_if_pmo_send_lphb_udp_pkt_filter(struct wlan_objmgr_psoc *psoc,
199*5113495bSYour Name 			struct pmo_lphb_udp_filter_req *ts_lphb_udp_filter)
200*5113495bSYour Name {
201*5113495bSYour Name 	wmi_hb_set_udp_pkt_filter_cmd_fixed_param hb_udp_filter_fp = {0};
202*5113495bSYour Name 	wmi_unified_t wmi_handle;
203*5113495bSYour Name 
204*5113495bSYour Name 	if (!ts_lphb_udp_filter) {
205*5113495bSYour Name 		target_if_err("LPHB UDP packet filter configuration is NULL");
206*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
207*5113495bSYour Name 	}
208*5113495bSYour Name 
209*5113495bSYour Name 	target_if_info("SET_UDP_PKT_FILTER length=%d, offset=%d, session=%d, "
210*5113495bSYour Name 		"filter=%2x:%2x:%2x:%2x:%2x:%2x ...",
211*5113495bSYour Name 		ts_lphb_udp_filter->length, ts_lphb_udp_filter->offset,
212*5113495bSYour Name 		ts_lphb_udp_filter->session, ts_lphb_udp_filter->filter[0],
213*5113495bSYour Name 		ts_lphb_udp_filter->filter[1], ts_lphb_udp_filter->filter[2],
214*5113495bSYour Name 		ts_lphb_udp_filter->filter[3], ts_lphb_udp_filter->filter[4],
215*5113495bSYour Name 		ts_lphb_udp_filter->filter[5]);
216*5113495bSYour Name 
217*5113495bSYour Name 	/* fill in values */
218*5113495bSYour Name 	hb_udp_filter_fp.vdev_id = ts_lphb_udp_filter->session;
219*5113495bSYour Name 	hb_udp_filter_fp.length = ts_lphb_udp_filter->length;
220*5113495bSYour Name 	hb_udp_filter_fp.offset = ts_lphb_udp_filter->offset;
221*5113495bSYour Name 	hb_udp_filter_fp.session = ts_lphb_udp_filter->session;
222*5113495bSYour Name 	qdf_mem_copy(&hb_udp_filter_fp.filter, &ts_lphb_udp_filter->filter,
223*5113495bSYour Name 		     WMI_WLAN_HB_MAX_FILTER_SIZE);
224*5113495bSYour Name 
225*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
226*5113495bSYour Name 	if (!wmi_handle) {
227*5113495bSYour Name 		target_if_err("Invalid wmi handle");
228*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
229*5113495bSYour Name 	}
230*5113495bSYour Name 
231*5113495bSYour Name 	return wmi_unified_lphb_config_udp_pkt_filter_cmd(wmi_handle,
232*5113495bSYour Name 							  &hb_udp_filter_fp);
233*5113495bSYour Name }
234*5113495bSYour Name 
target_if_pmo_lphb_evt_handler(struct wlan_objmgr_psoc * psoc,uint8_t * event)235*5113495bSYour Name QDF_STATUS target_if_pmo_lphb_evt_handler(struct wlan_objmgr_psoc *psoc,
236*5113495bSYour Name 		uint8_t *event)
237*5113495bSYour Name {
238*5113495bSYour Name 	wmi_hb_ind_event_fixed_param *hb_fp;
239*5113495bSYour Name 	struct pmo_lphb_rsp *slphb_indication = NULL;
240*5113495bSYour Name 	QDF_STATUS qdf_status;
241*5113495bSYour Name 
242*5113495bSYour Name 	TARGET_IF_ENTER();
243*5113495bSYour Name 	if (!psoc) {
244*5113495bSYour Name 		target_if_err("psoc ptr is NULL");
245*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NULL_VALUE;
246*5113495bSYour Name 		goto out;
247*5113495bSYour Name 	}
248*5113495bSYour Name 
249*5113495bSYour Name 	hb_fp = (wmi_hb_ind_event_fixed_param *) event;
250*5113495bSYour Name 	if (!hb_fp) {
251*5113495bSYour Name 		target_if_err("Invalid wmi_hb_ind_event_fixed_param buffer");
252*5113495bSYour Name 		qdf_status = QDF_STATUS_E_INVAL;
253*5113495bSYour Name 		goto out;
254*5113495bSYour Name 	}
255*5113495bSYour Name 
256*5113495bSYour Name 	target_if_debug("lphb indication received with\n"
257*5113495bSYour Name 		  "vdev_id=%d, session=%d, reason=%d",
258*5113495bSYour Name 		hb_fp->vdev_id, hb_fp->session, hb_fp->reason);
259*5113495bSYour Name 
260*5113495bSYour Name 	slphb_indication = (struct pmo_lphb_rsp *)qdf_mem_malloc(
261*5113495bSYour Name 				sizeof(struct pmo_lphb_rsp));
262*5113495bSYour Name 	if (!slphb_indication) {
263*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
264*5113495bSYour Name 		goto out;
265*5113495bSYour Name 	}
266*5113495bSYour Name 
267*5113495bSYour Name 	slphb_indication->session_idx = hb_fp->session;
268*5113495bSYour Name 	slphb_indication->protocol_type = hb_fp->reason;
269*5113495bSYour Name 	slphb_indication->event_reason = hb_fp->reason;
270*5113495bSYour Name 
271*5113495bSYour Name 	qdf_status = pmo_tgt_lphb_rsp_evt(psoc, slphb_indication);
272*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS)
273*5113495bSYour Name 		target_if_err("Failed to lphb_rsp_event");
274*5113495bSYour Name out:
275*5113495bSYour Name 	if (slphb_indication)
276*5113495bSYour Name 		qdf_mem_free(slphb_indication);
277*5113495bSYour Name 
278*5113495bSYour Name 	return qdf_status;
279*5113495bSYour Name }
280*5113495bSYour Name #endif
281*5113495bSYour Name 
282