1 /*
2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 #ifndef _CDP_TXRX_SAWF_H_
20 #define _CDP_TXRX_SAWF_H_
21
22 #include <cdp_txrx_cmn_struct.h>
23 #include <cdp_txrx_cmn.h>
24
25 static inline QDF_STATUS
cdp_sawf_peer_svcid_map(ol_txrx_soc_handle soc,uint8_t * mac,uint8_t svc_id)26 cdp_sawf_peer_svcid_map(ol_txrx_soc_handle soc,
27 uint8_t *mac, uint8_t svc_id)
28 {
29 if (!soc || !soc->ops) {
30 dp_cdp_debug("Invalid Instance");
31 QDF_BUG(0);
32 return QDF_STATUS_E_FAILURE;
33 }
34
35 if (!soc->ops->sawf_ops ||
36 !soc->ops->sawf_ops->sawf_def_queues_map_req) {
37 return QDF_STATUS_E_FAILURE;
38 }
39
40 return soc->ops->sawf_ops->sawf_def_queues_map_req(soc, mac, svc_id);
41 }
42
43 static inline QDF_STATUS
cdp_sawf_peer_unmap(ol_txrx_soc_handle soc,uint8_t * mac,uint8_t svc_id)44 cdp_sawf_peer_unmap(ol_txrx_soc_handle soc,
45 uint8_t *mac, uint8_t svc_id)
46 {
47 if (!soc || !soc->ops) {
48 dp_cdp_debug("Invalid Instance");
49 QDF_BUG(0);
50 return QDF_STATUS_E_FAILURE;
51 }
52
53 if (!soc->ops->sawf_ops ||
54 !soc->ops->sawf_ops->sawf_def_queues_unmap_req) {
55 return QDF_STATUS_E_FAILURE;
56 }
57
58 return soc->ops->sawf_ops->sawf_def_queues_unmap_req(soc, mac, svc_id);
59 }
60
61 static inline QDF_STATUS
cdp_sawf_peer_get_map_conf(ol_txrx_soc_handle soc,uint8_t * mac)62 cdp_sawf_peer_get_map_conf(ol_txrx_soc_handle soc,
63 uint8_t *mac)
64 {
65 if (!soc || !soc->ops) {
66 dp_cdp_debug("Invalid Instance");
67 QDF_BUG(0);
68 return QDF_STATUS_E_FAILURE;
69 }
70
71 if (!soc->ops->sawf_ops ||
72 !soc->ops->sawf_ops->sawf_def_queues_get_map_report) {
73 return QDF_STATUS_E_FAILURE;
74 }
75
76 return soc->ops->sawf_ops->sawf_def_queues_get_map_report(soc, mac);
77 }
78
79 static inline QDF_STATUS
cdp_sawf_peer_get_msduq_info(ol_txrx_soc_handle soc,uint8_t * mac)80 cdp_sawf_peer_get_msduq_info(ol_txrx_soc_handle soc, uint8_t *mac)
81 {
82 if (!soc || !soc->ops) {
83 dp_cdp_debug("Invalid Instance");
84 QDF_BUG(0);
85 return QDF_STATUS_E_FAILURE;
86 }
87
88 if (!soc->ops->sawf_ops ||
89 !soc->ops->sawf_ops->sawf_get_peer_msduq_info) {
90 return QDF_STATUS_E_FAILURE;
91 }
92
93 return soc->ops->sawf_ops->sawf_get_peer_msduq_info(soc, mac);
94 }
95
96 #ifdef CONFIG_SAWF
97 /**
98 * cdp_get_peer_sawf_delay_stats() - Call to get SAWF delay stats
99 * @soc: soc handle
100 * @svc_id: service class ID
101 * @mac: peer mac address
102 * @data: opaque pointer
103 *
104 * return: status Success/Failure
105 */
106 static inline QDF_STATUS
cdp_get_peer_sawf_delay_stats(ol_txrx_soc_handle soc,uint32_t svc_id,uint8_t * mac,void * data)107 cdp_get_peer_sawf_delay_stats(ol_txrx_soc_handle soc, uint32_t svc_id,
108 uint8_t *mac, void *data)
109 {
110 if (!soc || !soc->ops) {
111 dp_cdp_debug("Invalid Instance");
112 QDF_BUG(0);
113 return QDF_STATUS_E_FAILURE;
114 }
115
116 if (!soc->ops->sawf_ops ||
117 !soc->ops->sawf_ops->txrx_get_peer_sawf_delay_stats)
118 return QDF_STATUS_E_FAILURE;
119
120 return soc->ops->sawf_ops->txrx_get_peer_sawf_delay_stats(soc, svc_id,
121 mac, data);
122 }
123
124 /**
125 * cdp_get_peer_sawf_tx_stats() - Call to get SAWF Tx stats
126 * @soc: soc handle
127 * @svc_id: service class ID
128 * @mac: peer mac address
129 * @data: opaque pointer
130 *
131 * return: status Success/Failure
132 */
133 static inline QDF_STATUS
cdp_get_peer_sawf_tx_stats(ol_txrx_soc_handle soc,uint32_t svc_id,uint8_t * mac,void * data)134 cdp_get_peer_sawf_tx_stats(ol_txrx_soc_handle soc, uint32_t svc_id,
135 uint8_t *mac, void *data)
136 {
137 if (!soc || !soc->ops) {
138 dp_cdp_debug("Invalid Instance");
139 QDF_BUG(0);
140 return QDF_STATUS_E_FAILURE;
141 }
142
143 if (!soc->ops->sawf_ops ||
144 !soc->ops->sawf_ops->txrx_get_peer_sawf_tx_stats)
145 return QDF_STATUS_E_FAILURE;
146
147 return soc->ops->sawf_ops->txrx_get_peer_sawf_tx_stats(soc, svc_id,
148 mac, data);
149 }
150
151 /**
152 * cdp_sawf_mpdu_stats_req() - Call to subscribe to MPDU stats TLV
153 * @soc: soc handle
154 * @enable: 1: enable 0: disable
155 *
156 * return: status Success/Failure
157 */
158 static inline QDF_STATUS
cdp_sawf_mpdu_stats_req(ol_txrx_soc_handle soc,uint8_t enable)159 cdp_sawf_mpdu_stats_req(ol_txrx_soc_handle soc, uint8_t enable)
160 {
161 if (!soc || !soc->ops) {
162 dp_cdp_debug("Invalid Instance");
163 QDF_BUG(0);
164 return QDF_STATUS_E_FAILURE;
165 }
166
167 if (!soc->ops->sawf_ops ||
168 !soc->ops->sawf_ops->sawf_mpdu_stats_req)
169 return QDF_STATUS_E_FAILURE;
170
171 return soc->ops->sawf_ops->sawf_mpdu_stats_req(soc, enable);
172 }
173
174 /**
175 * cdp_sawf_mpdu_details_stats_req - Call to subscribe to MPDU details stats TLV
176 * @soc: soc handle
177 * @enable: 1: enable 0: disable
178 *
179 * return: status Success/Failure
180 */
181 static inline QDF_STATUS
cdp_sawf_mpdu_details_stats_req(ol_txrx_soc_handle soc,uint8_t enable)182 cdp_sawf_mpdu_details_stats_req(ol_txrx_soc_handle soc, uint8_t enable)
183 {
184 if (!soc || !soc->ops) {
185 dp_cdp_debug("Invalid Instance");
186 QDF_BUG(0);
187 return QDF_STATUS_E_FAILURE;
188 }
189
190 if (!soc->ops->sawf_ops ||
191 !soc->ops->sawf_ops->sawf_mpdu_details_stats_req)
192 return QDF_STATUS_E_FAILURE;
193
194 return soc->ops->sawf_ops->sawf_mpdu_details_stats_req(soc, enable);
195 }
196
197 /**
198 * cdp_sawf_set_mov_avg_params - Set moving average pararms
199 * @soc: SOC handle
200 * @num_pkt: No of packets per window to calucalte moving average
201 * @num_win: No of windows to calucalte moving average
202 *
203 * Return: QDF_STATUS
204 */
205 static inline QDF_STATUS
cdp_sawf_set_mov_avg_params(ol_txrx_soc_handle soc,uint32_t num_pkt,uint32_t num_win)206 cdp_sawf_set_mov_avg_params(ol_txrx_soc_handle soc,
207 uint32_t num_pkt,
208 uint32_t num_win)
209 {
210 if (!soc || !soc->ops) {
211 dp_cdp_debug("Invalid Instance");
212 QDF_BUG(0);
213 return QDF_STATUS_E_FAILURE;
214 }
215
216 if (!soc->ops->sawf_ops ||
217 !soc->ops->sawf_ops->txrx_sawf_set_mov_avg_params)
218 return QDF_STATUS_E_FAILURE;
219
220 return soc->ops->sawf_ops->txrx_sawf_set_mov_avg_params(num_pkt,
221 num_win);
222 }
223
224 /**
225 * cdp_sawf_set_sla_params - Set SLA pararms
226 * @soc: SOC handle
227 * @num_pkt: No of packets to detect SLA breach
228 * @time_secs: Time ins secs to detect breach
229 *
230 * Return: QDF_STATUS
231 */
232 static inline QDF_STATUS
cdp_sawf_set_sla_params(ol_txrx_soc_handle soc,uint32_t num_pkt,uint32_t time_secs)233 cdp_sawf_set_sla_params(ol_txrx_soc_handle soc,
234 uint32_t num_pkt,
235 uint32_t time_secs)
236 {
237 if (!soc || !soc->ops) {
238 dp_cdp_debug("Invalid Instance");
239 QDF_BUG(0);
240 return QDF_STATUS_E_FAILURE;
241 }
242
243 if (!soc->ops->sawf_ops ||
244 !soc->ops->sawf_ops->txrx_sawf_set_sla_params)
245 return QDF_STATUS_E_FAILURE;
246
247 return soc->ops->sawf_ops->txrx_sawf_set_sla_params(num_pkt,
248 time_secs);
249 }
250
251 /**
252 * cdp_sawf_init_telemtery_params() - Initialize telemetry pararms
253 * @soc: SOC handle
254 *
255 * Return: none
256 */
257 static inline QDF_STATUS
cdp_sawf_init_telemtery_params(ol_txrx_soc_handle soc)258 cdp_sawf_init_telemtery_params(ol_txrx_soc_handle soc)
259 {
260 if (!soc || !soc->ops) {
261 dp_cdp_debug("Invalid Instance");
262 QDF_BUG(0);
263 return QDF_STATUS_E_FAILURE;
264 }
265
266 if (!soc->ops->sawf_ops ||
267 !soc->ops->sawf_ops->txrx_sawf_init_telemtery_params)
268 return QDF_STATUS_E_FAILURE;
269
270 return soc->ops->sawf_ops->txrx_sawf_init_telemtery_params();
271 }
272
273 static inline QDF_STATUS
cdp_get_throughput_stats(ol_txrx_soc_handle soc,void * arg,uint64_t * in_bytes,uint64_t * in_cnt,uint64_t * tx_bytes,uint64_t * tx_cnt,uint8_t tid,uint8_t msduq)274 cdp_get_throughput_stats(ol_txrx_soc_handle soc, void *arg,
275 uint64_t *in_bytes, uint64_t *in_cnt,
276 uint64_t *tx_bytes, uint64_t *tx_cnt,
277 uint8_t tid, uint8_t msduq)
278 {
279 if (!soc || !soc->ops) {
280 dp_cdp_debug("Invalid Instance");
281 QDF_BUG(0);
282 return QDF_STATUS_E_FAILURE;
283 }
284
285 if (!soc->ops->sawf_ops ||
286 !soc->ops->sawf_ops->telemetry_get_throughput_stats)
287 return QDF_STATUS_E_FAILURE;
288
289 return soc->ops->sawf_ops->telemetry_get_throughput_stats(
290 arg, in_bytes, in_cnt, tx_bytes,
291 tx_cnt, tid, msduq);
292 }
293
294 static inline QDF_STATUS
cdp_get_mpdu_stats(ol_txrx_soc_handle soc,void * arg,uint64_t * svc_int_pass,uint64_t * svc_int_fail,uint64_t * burst_pass,uint64_t * burst_fail,uint8_t tid,uint8_t msduq)295 cdp_get_mpdu_stats(ol_txrx_soc_handle soc, void *arg,
296 uint64_t *svc_int_pass, uint64_t *svc_int_fail,
297 uint64_t *burst_pass, uint64_t *burst_fail,
298 uint8_t tid, uint8_t msduq)
299 {
300 if (!soc || !soc->ops) {
301 dp_cdp_debug("Invalid Instance");
302 QDF_BUG(0);
303 return QDF_STATUS_E_FAILURE;
304 }
305
306 if (!soc->ops->sawf_ops ||
307 !soc->ops->sawf_ops->telemetry_get_mpdu_stats)
308 return QDF_STATUS_E_FAILURE;
309
310 return soc->ops->sawf_ops->telemetry_get_mpdu_stats(
311 arg, svc_int_pass, svc_int_fail, burst_pass,
312 burst_fail, tid, msduq);
313 }
314
315 static inline QDF_STATUS
cdp_get_drop_stats(ol_txrx_soc_handle soc,void * arg,uint64_t * pass,uint64_t * drop,uint64_t * drop_ttl,uint8_t tid,uint8_t msduq)316 cdp_get_drop_stats(ol_txrx_soc_handle soc, void *arg,
317 uint64_t *pass, uint64_t *drop,
318 uint64_t *drop_ttl,
319 uint8_t tid, uint8_t msduq)
320 {
321 if (!soc || !soc->ops) {
322 dp_cdp_debug("Invalid Instance");
323 QDF_BUG(0);
324 return QDF_STATUS_E_FAILURE;
325 }
326
327 if (!soc->ops->sawf_ops ||
328 !soc->ops->sawf_ops->telemetry_get_drop_stats)
329 return QDF_STATUS_E_FAILURE;
330
331 return soc->ops->sawf_ops->telemetry_get_drop_stats(
332 arg, pass, drop, drop_ttl, tid, msduq);
333 }
334
335 /**
336 * cdp_sawf_peer_config_ul - Config uplink QoS parameters
337 * @soc: SOC handle
338 * @mac_addr: MAC address
339 * @tid: TID
340 * @service_interval: Service Interval
341 * @burst_size: Burst Size
342 * @min_tput: Min throughput
343 * @max_latency: Max latency
344 * @add_or_sub: Add or Sub parameters
345 * @peer_id: peer id
346 *
347 * Return: QDF_STATUS
348 */
349 static inline QDF_STATUS
cdp_sawf_peer_config_ul(ol_txrx_soc_handle soc,uint8_t * mac_addr,uint8_t tid,uint32_t service_interval,uint32_t burst_size,uint32_t min_tput,uint32_t max_latency,uint8_t add_or_sub,uint16_t peer_id)350 cdp_sawf_peer_config_ul(ol_txrx_soc_handle soc, uint8_t *mac_addr, uint8_t tid,
351 uint32_t service_interval, uint32_t burst_size,
352 uint32_t min_tput, uint32_t max_latency,
353 uint8_t add_or_sub, uint16_t peer_id)
354 {
355 if (!soc || !soc->ops || !soc->ops->sawf_ops ||
356 !soc->ops->sawf_ops->peer_config_ul) {
357 dp_cdp_debug("Invalid Instance");
358 QDF_BUG(0);
359 return false;
360 }
361
362 return soc->ops->sawf_ops->peer_config_ul(soc, mac_addr, tid,
363 service_interval, burst_size,
364 min_tput, max_latency,
365 add_or_sub, peer_id);
366 }
367
368 /**
369 * cdp_sawf_peer_flow_count - Peer flow count in SAWF
370 * @soc: SOC handle
371 * @mac_addr: MAC address
372 * @svc_id: Service Class ID
373 * @direction: Indication of forward or reverse service class match
374 * @start_or_stop: Indication of start or stop
375 * @peer_mac: Peer MAC address
376 * @peer_id: peer id
377 *
378 * Return: QDF_STATUS
379 */
380 static inline QDF_STATUS
cdp_sawf_peer_flow_count(ol_txrx_soc_handle soc,uint8_t * mac_addr,uint8_t svc_id,uint8_t direction,uint8_t start_or_stop,uint8_t * peer_mac,uint16_t peer_id)381 cdp_sawf_peer_flow_count(ol_txrx_soc_handle soc, uint8_t *mac_addr,
382 uint8_t svc_id, uint8_t direction,
383 uint8_t start_or_stop, uint8_t *peer_mac,
384 uint16_t peer_id)
385 {
386 if (!soc || !soc->ops || !soc->ops->sawf_ops ||
387 !soc->ops->sawf_ops->sawf_peer_flow_count) {
388 dp_cdp_debug("Invalid Instance");
389 QDF_BUG(0);
390 return false;
391 }
392
393 return soc->ops->sawf_ops->sawf_peer_flow_count
394 (soc, mac_addr, svc_id, direction, start_or_stop, peer_mac,
395 peer_id);
396 }
397
398 /**
399 * cdp_swaf_peer_sla_configuration() - Check if sla is configured for a peer
400 * @soc: SOC handle
401 * @mac_addr: peer mac address
402 * @sla_mask: pointer to SLA mask
403 * Return: QDF_STATUS
404 */
405 static inline QDF_STATUS
cdp_swaf_peer_sla_configuration(ol_txrx_soc_handle soc,uint8_t * mac_addr,uint16_t * sla_mask)406 cdp_swaf_peer_sla_configuration(ol_txrx_soc_handle soc, uint8_t *mac_addr,
407 uint16_t *sla_mask)
408 {
409 if (!soc || !soc->ops || !soc->ops->sawf_ops ||
410 !soc->ops->sawf_ops->swaf_peer_sla_configuration) {
411 dp_cdp_debug("Invalid Instance");
412 QDF_BUG(0);
413 return QDF_STATUS_E_INVAL;
414 }
415
416 return soc->ops->sawf_ops->swaf_peer_sla_configuration(soc, mac_addr,
417 sla_mask);
418 }
419
420 #else
421 static inline QDF_STATUS
cdp_sawf_mpdu_stats_req(ol_txrx_soc_handle soc,uint8_t enable)422 cdp_sawf_mpdu_stats_req(ol_txrx_soc_handle soc, uint8_t enable)
423 {
424 return QDF_STATUS_E_FAILURE;
425 }
426
427 static inline QDF_STATUS
cdp_sawf_mpdu_details_stats_req(ol_txrx_soc_handle soc,uint8_t enable)428 cdp_sawf_mpdu_details_stats_req(ol_txrx_soc_handle soc, uint8_t enable)
429 {
430 return QDF_STATUS_E_FAILURE;
431 }
432
433 static inline QDF_STATUS
cdp_get_peer_sawf_delay_stats(ol_txrx_soc_handle soc,uint32_t svc_id,uint8_t * mac,void * data)434 cdp_get_peer_sawf_delay_stats(ol_txrx_soc_handle soc, uint32_t svc_id,
435 uint8_t *mac, void *data)
436 {
437 return QDF_STATUS_E_FAILURE;
438 }
439
440 static inline QDF_STATUS
cdp_get_peer_sawf_tx_stats(ol_txrx_soc_handle soc,uint32_t svc_id,uint8_t * mac,void * data)441 cdp_get_peer_sawf_tx_stats(ol_txrx_soc_handle soc, uint32_t svc_id,
442 uint8_t *mac, void *data)
443 {
444 return QDF_STATUS_E_FAILURE;
445 }
446
447 static inline QDF_STATUS
cdp_swaf_peer_sla_configuration(ol_txrx_soc_handle soc,uint8_t * mac_addr,uint16_t * sla_mask)448 cdp_swaf_peer_sla_configuration(ol_txrx_soc_handle soc, uint8_t *mac_addr,
449 uint16_t *sla_mask)
450 {
451 return QDF_STATUS_E_FAILURE;
452 }
453 #endif
454
455 #ifdef WLAN_FEATURE_11BE_MLO_3_LINK_TX
456 static inline
cdp_sawf_get_peer_msduq(ol_txrx_soc_handle soc,struct net_device * netdev,uint8_t * dest_mac,uint32_t dscp_pcp,bool pcp)457 uint16_t cdp_sawf_get_peer_msduq(ol_txrx_soc_handle soc,
458 struct net_device *netdev, uint8_t *dest_mac,
459 uint32_t dscp_pcp, bool pcp)
460 {
461 if (!soc || !soc->ops || !soc->ops->sawf_ops ||
462 !soc->ops->sawf_ops->get_peer_msduq) {
463 dp_cdp_debug("Invalid Instance");
464 QDF_BUG(0);
465 return false;
466 }
467
468 return soc->ops->sawf_ops->get_peer_msduq
469 (netdev, dest_mac, dscp_pcp, pcp);
470 }
471
472 static inline QDF_STATUS
cdp_sawf_3_link_peer_flow_count(ol_txrx_soc_handle soc,uint8_t * mac_addr,uint16_t peer_id,uint32_t mark_metadata)473 cdp_sawf_3_link_peer_flow_count(ol_txrx_soc_handle soc, uint8_t *mac_addr,
474 uint16_t peer_id, uint32_t mark_metadata)
475 {
476 if (!soc || !soc->ops || !soc->ops->sawf_ops ||
477 !soc->ops->sawf_ops->sawf_3_link_peer_flow_count) {
478 dp_cdp_debug("Invalid Instance");
479 QDF_BUG(0);
480 return false;
481 }
482
483 return soc->ops->sawf_ops->sawf_3_link_peer_flow_count
484 (soc, mac_addr, peer_id, mark_metadata);
485 }
486 #endif
487 #endif /* _CDP_TXRX_SAWF_H_ */
488