xref: /wlan-dirver/qca-wifi-host-cmn/target_if/twt/src/target_if_twt.c (revision d0c05845839e5f2ba5a8dcebe0cd3e4cd4e8dfcf)
1 /*
2  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  *  DOC: target_if_twt.c
19  *  This file contains twt component's target related function definitions
20  */
21 #include <target_if_twt.h>
22 #include <target_if_twt_cmd.h>
23 #include <target_if_twt_evt.h>
24 #include <target_if_ext_twt.h>
25 #include "twt/core/src/wlan_twt_common.h"
26 #include "twt/core/src/wlan_twt_priv.h"
27 
28 QDF_STATUS
29 target_if_twt_register_events(struct wlan_objmgr_psoc *psoc)
30 {
31 	QDF_STATUS status;
32 	struct wmi_unified *wmi_handle;
33 
34 	if (!psoc) {
35 		target_if_err("psoc obj is null!");
36 		return QDF_STATUS_E_NULL_VALUE;
37 	}
38 
39 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
40 	if (!wmi_handle) {
41 		target_if_err("wmi_handle is null!");
42 		return QDF_STATUS_E_INVAL;
43 	}
44 
45 	status = wmi_unified_register_event_handler(wmi_handle,
46 					wmi_twt_enable_complete_event_id,
47 					target_if_twt_en_complete_event_handler,
48 					WMI_RX_WORK_CTX);
49 	if (QDF_IS_STATUS_ERROR(status)) {
50 		target_if_err("Failed to register twt enable event cb");
51 		if (status ==  QDF_STATUS_E_NOSUPPORT)
52 			status = QDF_STATUS_SUCCESS;
53 		return status;
54 	}
55 
56 	status = wmi_unified_register_event_handler(wmi_handle,
57 				wmi_twt_disable_complete_event_id,
58 				target_if_twt_disable_comp_event_handler,
59 				WMI_RX_WORK_CTX);
60 	if (QDF_IS_STATUS_ERROR(status)) {
61 		target_if_err("Failed to register twt disable event cb");
62 		if (status ==  QDF_STATUS_E_NOSUPPORT)
63 			status = QDF_STATUS_SUCCESS;
64 		return status;
65 	}
66 
67 	status = target_if_twt_register_ext_events(psoc);
68 	if (QDF_IS_STATUS_ERROR(status)) {
69 		target_if_err("Failed to register twt ext events");
70 		if (status ==  QDF_STATUS_E_NOSUPPORT)
71 			status = QDF_STATUS_SUCCESS;
72 		return status;
73 	}
74 
75 	return status;
76 }
77 
78 QDF_STATUS
79 target_if_twt_deregister_events(struct wlan_objmgr_psoc *psoc)
80 {
81 	QDF_STATUS status;
82 	struct wmi_unified *wmi_handle;
83 
84 	if (!psoc) {
85 		target_if_err("psoc is NULL!");
86 		return QDF_STATUS_E_INVAL;
87 	}
88 
89 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
90 	if (!wmi_handle) {
91 		target_if_err("wmi_handle is null");
92 		return QDF_STATUS_E_NULL_VALUE;
93 	}
94 
95 	status = wmi_unified_unregister_event_handler(wmi_handle,
96 					wmi_twt_enable_complete_event_id);
97 	if (QDF_IS_STATUS_ERROR(status)) {
98 		target_if_err("Failed to deregister twt enable event cb");
99 		if (status ==  QDF_STATUS_E_NOSUPPORT)
100 			status = QDF_STATUS_SUCCESS;
101 		return status;
102 	}
103 
104 	status = wmi_unified_unregister_event_handler(wmi_handle,
105 					 wmi_twt_disable_complete_event_id);
106 	if (QDF_IS_STATUS_ERROR(status)) {
107 		target_if_err("Failed to deregister twt disable event cb");
108 		if (status ==  QDF_STATUS_E_NOSUPPORT)
109 			status = QDF_STATUS_SUCCESS;
110 		return status;
111 	}
112 
113 	status = target_if_twt_deregister_ext_events(psoc);
114 	if (QDF_IS_STATUS_ERROR(status)) {
115 		target_if_err("Failed to deregister twt ext events");
116 		if (status ==  QDF_STATUS_E_NOSUPPORT)
117 			status = QDF_STATUS_SUCCESS;
118 		return status;
119 	}
120 
121 	return status;
122 }
123 
124 QDF_STATUS
125 target_if_twt_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
126 {
127 	struct wlan_lmac_if_twt_tx_ops *twt_tx_ops;
128 	QDF_STATUS status;
129 
130 	if (!tx_ops) {
131 		target_if_err("txops is NULL");
132 		return QDF_STATUS_E_FAILURE;
133 	}
134 
135 	twt_tx_ops = &tx_ops->twt_tx_ops;
136 	twt_tx_ops->enable_req = target_if_twt_enable_req;
137 	twt_tx_ops->disable_req = target_if_twt_disable_req;
138 	twt_tx_ops->register_events = target_if_twt_register_events;
139 	twt_tx_ops->deregister_events = target_if_twt_deregister_events;
140 
141 	status = target_if_twt_register_ext_tx_ops(twt_tx_ops);
142 	if (QDF_IS_STATUS_ERROR(status)) {
143 		target_if_err("Failed to register twt ext tx ops");
144 		return status;
145 	}
146 
147 	return status;
148 }
149 
150 QDF_STATUS
151 target_if_twt_set_twt_ack_support(struct wlan_objmgr_psoc *psoc,
152 				  bool val)
153 {
154 	struct twt_psoc_priv_obj *twt_psoc;
155 
156 	if (!psoc) {
157 		target_if_err("null psoc");
158 		return QDF_STATUS_E_FAILURE;
159 	}
160 
161 	twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
162 							 WLAN_UMAC_COMP_TWT);
163 	if (!twt_psoc) {
164 		target_if_err("null twt psoc priv obj");
165 		return QDF_STATUS_E_FAILURE;
166 	}
167 
168 	twt_psoc->twt_caps.twt_ack_supported = val;
169 	return QDF_STATUS_SUCCESS;
170 }
171 
172 QDF_STATUS
173 target_if_twt_fill_tgt_caps(struct wlan_objmgr_psoc *psoc,
174 			    wmi_unified_t wmi_handle)
175 {
176 	struct twt_psoc_priv_obj *twt_psoc;
177 	struct twt_tgt_caps *caps = NULL;
178 
179 	if (!psoc || !wmi_handle) {
180 		target_if_err("null wmi_handle or psoc");
181 		return QDF_STATUS_E_FAILURE;
182 	}
183 
184 	twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
185 							 WLAN_UMAC_COMP_TWT);
186 	if (!twt_psoc) {
187 		target_if_err("null twt psoc priv obj");
188 		return QDF_STATUS_E_FAILURE;
189 	}
190 
191 	caps = &twt_psoc->twt_caps;
192 
193 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
194 		caps->twt_requestor = true;
195 	else
196 		caps->twt_requestor = false;
197 
198 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
199 		caps->twt_responder = true;
200 	else
201 		caps->twt_responder = false;
202 
203 	if (wmi_service_enabled(wmi_handle, wmi_service_bcast_twt_support))
204 		caps->legacy_bcast_twt_support = true;
205 	else
206 		caps->legacy_bcast_twt_support = false;
207 
208 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_bcast_req_support))
209 		caps->twt_bcast_req_support = true;
210 	else
211 		caps->twt_bcast_req_support = false;
212 
213 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_bcast_resp_support))
214 		caps->twt_bcast_res_support = true;
215 	else
216 		caps->twt_bcast_res_support = false;
217 
218 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_nudge))
219 		caps->twt_nudge_enabled = true;
220 	else
221 		caps->twt_nudge_enabled = false;
222 
223 	if (wmi_service_enabled(wmi_handle, wmi_service_all_twt))
224 		caps->all_twt_enabled = true;
225 	else
226 		caps->all_twt_enabled = false;
227 
228 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_statistics))
229 		caps->twt_stats_enabled = true;
230 	else
231 		caps->twt_stats_enabled = false;
232 
233 	target_if_debug("req:%d res:%d legacy_bcast_twt_support:%d",
234 		caps->twt_requestor,
235 		caps->twt_responder,
236 		caps->legacy_bcast_twt_support);
237 	target_if_debug("twt_bcast_req_support:%d twt_bcast_res_support:%d",
238 		caps->twt_bcast_req_support,
239 		caps->twt_bcast_res_support);
240 	target_if_debug("nudge_enabled:%d all_twt_enabled:%d stats_enabled:%d",
241 		caps->twt_nudge_enabled,
242 		caps->all_twt_enabled,
243 		caps->twt_stats_enabled);
244 	return QDF_STATUS_SUCCESS;
245 }
246 
247