1 /*
2  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wlan_cp_stats_mc_ucfg_api.h
22  *
23  * This header file maintain API declaration required for northbound interaction
24  */
25 
26 #ifndef __WLAN_CP_STATS_MC_UCFG_API_H__
27 #define __WLAN_CP_STATS_MC_UCFG_API_H__
28 
29 #ifdef QCA_SUPPORT_CP_STATS
30 
31 #include <wlan_objmgr_psoc_obj.h>
32 #include <wlan_objmgr_vdev_obj.h>
33 #include <wlan_cp_stats_mc_defs.h>
34 
35 #ifdef WLAN_SUPPORT_TWT
36 
37 #include <wlan_objmgr_peer_obj.h>
38 #include "../../core/src/wlan_cp_stats_defs.h"
39 #include <qdf_event.h>
40 
41 /* Max TWT sessions supported */
42 #define TWT_PSOC_MAX_SESSIONS TWT_PEER_MAX_SESSIONS
43 
44 /**
45  * ucfg_twt_get_peer_session_params() - Retrieves peer twt session parameters
46  * corresponding to a peer by using mac_addr and dialog id
47  * If dialog_id is TWT_GET_ALL_PEER_PARAMS_DIALOG_ID retrieves twt session
48  * parameters of all peers with valid twt session
49  * @psoc_obj: psoc object
50  * @param: array pointer to store peer twt session parameters, should contain
51  * mac_addr and dialog id of a peer for which twt session stats to be retrieved
52  *
53  * Return: total number of valid twt session
54  */
55 int
56 ucfg_twt_get_peer_session_params(struct wlan_objmgr_psoc *psoc_obj,
57 				 struct wmi_host_twt_session_stats_info *param);
58 #endif /* WLAN_SUPPORT_TWT */
59 
60 struct psoc_cp_stats;
61 struct vdev_cp_stats;
62 
63 /**
64  * ucfg_mc_cp_stats_get_psoc_wake_lock_stats() : API to get wake lock stats from
65  * psoc
66  * @psoc: pointer to psoc object
67  * @stats: stats object to populate
68  *
69  * Return : status of operation
70  */
71 QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats(
72 						struct wlan_objmgr_psoc *psoc,
73 						struct wake_lock_stats *stats);
74 
75 /**
76  * ucfg_mc_cp_stats_get_vdev_wake_lock_stats() : API to get wake lock stats from
77  * vdev
78  * @vdev: pointer to vdev object
79  * @stats: stats object to populate
80  *
81  * Return : status of operation
82  */
83 QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats(
84 						struct wlan_objmgr_vdev *vdev,
85 						struct wake_lock_stats *stats);
86 
87 /**
88  * ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol() : API to increment wake
89  * lock stats given the protocol of the packet that was received.
90  * @psoc: pointer to psoc object
91  * @vdev_id: vdev_id for which the packet was received
92  * @protocol: protocol of the packet that was received
93  *
94  * Return : status of operation
95  */
96 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
97 					struct wlan_objmgr_psoc *psoc,
98 					uint8_t vdev_id,
99 					enum qdf_proto_subtype protocol);
100 
101 /**
102  * ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr() : API to increment wake
103  * lock stats given destination of packet that was received.
104  * @psoc: pointer to psoc object
105  * @vdev_id: vdev_id for which the packet was received
106  * @dest_mac: destination mac address of packet that was received
107  *
108  * Return : status of operation
109  */
110 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
111 					struct wlan_objmgr_psoc *psoc,
112 					uint8_t vdev_id, uint8_t *dest_mac);
113 
114 /**
115  * ucfg_mc_cp_stats_inc_wake_lock_stats() : API to increment wake lock stats
116  * given wake reason.
117  * @psoc: pointer to psoc object
118  * @vdev_id: vdev_id on with WOW was received
119  * @reason: reason of WOW
120  *
121  * Return : status of operation
122  */
123 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc,
124 						uint8_t vdev_id,
125 						uint32_t reason);
126 
127 /**
128  * ucfg_mc_cp_stats_write_wow_stats() - Writes WOW stats to buffer
129  * @psoc: pointer to psoc object
130  * @buffer: The char buffer to write to
131  * @max_len: The maximum number of chars to write
132  * @ret: number of bytes written
133  *
134  * Return: status of operation
135  */
136 QDF_STATUS ucfg_mc_cp_stats_write_wow_stats(
137 				struct wlan_objmgr_psoc *psoc,
138 				char *buffer, uint16_t max_len, int *ret);
139 
140 /**
141  * ucfg_mc_cp_stats_send_stats_request() - API to send stats request to lmac
142  * @vdev: pointer to vdev object
143  * @type: request type
144  * @info: specific request information
145  *
146  * Return: status of operation
147  */
148 QDF_STATUS ucfg_mc_cp_stats_send_stats_request(struct wlan_objmgr_vdev *vdev,
149 					       enum stats_req_type type,
150 					       struct request_info *info);
151 
152 /**
153  * wlan_cfg80211_mc_twt_clear_infra_cp_stats() - send request to reset
154  * control path statistics
155  * @vdev: pointer to vdev object
156  * @dialog_id: dialod id of the twt session
157  * @twt_peer_mac: mac address of the peer
158  *
159  * Return: 0 for success or error code for failure
160  */
161 int
162 wlan_cfg80211_mc_twt_clear_infra_cp_stats(
163 				struct wlan_objmgr_vdev *vdev,
164 				uint32_t dialog_id,
165 				uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE]);
166 
167 /**
168  * wlan_cfg80211_mc_twt_get_infra_cp_stats() - send twt get statistic request
169  * @vdev: pointer to vdev object
170  * @dialog_id: TWT session dialog id
171  * @twt_peer_mac: mac address of the peer
172  * @errno: error code
173  *
174  * Return: pointer to infra cp stats event for success or NULL for failure
175  */
176 struct infra_cp_stats_event *
177 wlan_cfg80211_mc_twt_get_infra_cp_stats(struct wlan_objmgr_vdev *vdev,
178 					uint32_t dialog_id,
179 					uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE],
180 					int *errno);
181 /**
182  * ucfg_mc_cp_stats_get_tx_power() - API to fetch tx_power
183  * @vdev: pointer to vdev object
184  * @dbm: pointer to tx power in dbm
185  *
186  * Return: status of operation
187  */
188 QDF_STATUS ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev,
189 					 int *dbm);
190 
191 /**
192  * ucfg_mc_cp_stats_is_req_pending() - API to tell if given request is pending
193  * @psoc: pointer to psoc object
194  * @type: request type to check
195  *
196  * Return: true of request is pending, false otherwise
197  */
198 bool ucfg_mc_cp_stats_is_req_pending(struct wlan_objmgr_psoc *psoc,
199 				     enum stats_req_type type);
200 
201 /**
202  * ucfg_mc_cp_stats_set_pending_req() - API to set pending request
203  * @psoc: pointer to psoc object
204  * @type: request to update
205  * @req: value to update
206  *
207  * Return: status of operation
208  */
209 QDF_STATUS ucfg_mc_cp_stats_set_pending_req(struct wlan_objmgr_psoc *psoc,
210 					    enum stats_req_type type,
211 					    struct request_info *req);
212 /**
213  * ucfg_mc_cp_stats_reset_pending_req() - API to reset pending request
214  * @psoc: pointer to psoc object
215  * @type: request to update
216  * @last_req: last request
217  * @pending: pending request present
218  *
219  * The function is an atomic operation of "reset" and "get" last request.
220  *
221  * Return: status of operation
222  */
223 QDF_STATUS ucfg_mc_cp_stats_reset_pending_req(struct wlan_objmgr_psoc *psoc,
224 					      enum stats_req_type type,
225 					      struct request_info *last_req,
226 					      bool *pending);
227 
228 /**
229  * ucfg_mc_cp_stats_get_pending_req() - API to get pending request
230  * @psoc: pointer to psoc object
231  * @type: request to update
232  * @info: buffer to populate
233  *
234  * Return: status of operation
235  */
236 QDF_STATUS ucfg_mc_cp_stats_get_pending_req(struct wlan_objmgr_psoc *psoc,
237 					    enum stats_req_type type,
238 					    struct request_info *info);
239 
240 /**
241  * ucfg_mc_infra_cp_stats_free_stats_resources() - API to free buffers within
242  * infra cp stats_event structure
243  * @ev: structure whose buffer are to freed
244  *
245  * Return: none
246  */
247 void
248 ucfg_mc_infra_cp_stats_free_stats_resources(struct infra_cp_stats_event *ev);
249 
250 /**
251  * ucfg_mc_cp_stats_free_stats_resources() - API to free buffers within stats_event
252  * structure
253  * @ev: structure whose buffer are to freed
254  *
255  * Return: none
256  */
257 void ucfg_mc_cp_stats_free_stats_resources(struct stats_event *ev);
258 
259 /**
260  * ucfg_mc_cp_stats_cca_stats_get() - API to fetch cca stats
261  * @vdev: pointer to vdev object
262  * @cca_stats: pointer to cca info
263  *
264  * Return: status of operation
265  */
266 QDF_STATUS ucfg_mc_cp_stats_cca_stats_get(struct wlan_objmgr_vdev *vdev,
267 					  struct cca_stats *cca_stats);
268 
269 /**
270  * ucfg_mc_cp_stats_set_rate_flags() - API to set rate flags
271  * @vdev: pointer to vdev object
272  * @flags: value to set
273  *
274  * Return: status of operation
275  */
276 QDF_STATUS ucfg_mc_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev,
277 					   uint32_t flags);
278 
279 /**
280  * ucfg_mc_cp_stats_register_lost_link_info_cb() - API to register lost link
281  * info callback
282  * @psoc: pointer to psoc object
283  * @lost_link_cp_stats_info_cb: Lost link info callback to be registered
284  *
285  */
286 void ucfg_mc_cp_stats_register_lost_link_info_cb(
287 		struct wlan_objmgr_psoc *psoc,
288 		void (*lost_link_cp_stats_info_cb)(void *stats_ev));
289 
290 #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
291 /**
292  * ucfg_mc_cp_stats_register_pmo_handler() - API to register pmo handler
293  *
294  * Return: none
295  */
296 void ucfg_mc_cp_stats_register_pmo_handler(void);
297 #else
ucfg_mc_cp_stats_register_pmo_handler(void)298 void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { };
299 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
300 
301 #ifdef WLAN_FEATURE_BIG_DATA_STATS
302 /**
303  * ucfg_send_big_data_stats_request() - API to send big data stats
304  * request
305  * @vdev: pointer to vdev object
306  * @type: request type
307  * @info: request info
308  *
309  * Return: status of operation
310  */
311 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
312 					    enum stats_req_type type,
313 					    struct request_info *info);
314 
315 /**
316  * ucfg_mc_cp_set_big_data_fw_support() - set big data fw support
317  * @psoc: PSOC object
318  * @enable: Set true if firmware supports big data, otherwise false
319  *
320  * API to set fw supports big data feature or not
321  *
322  * Return: void
323  */
324 void
325 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
326 				   bool enable);
327 
328 /**
329  * ucfg_mc_cp_get_big_data_fw_support() - get big data fw support
330  * @psoc: PSOC object
331  * @enable: Set true if firmware supports big data, otherwise false
332  *
333  * API to get fw supports big data feature or not
334  *
335  * Return: void
336  */
337 void
338 ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
339 				   bool *enable);
340 #else
341 static inline
ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev * vdev,enum stats_req_type type,struct request_info * info)342 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
343 					    enum stats_req_type type,
344 					    struct request_info *info)
345 {
346 	return QDF_STATUS_SUCCESS;
347 }
348 
349 static inline void
ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc * psoc,bool enable)350 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
351 				   bool enable)
352 {}
353 
354 static inline void
ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc * psoc,bool * enable)355 ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
356 				   bool *enable)
357 {}
358 #endif
359 
360 #ifdef CONFIG_WLAN_BMISS
361 /**
362  * wlan_cfg80211_mc_bmiss_get_infra_cp_stats() - API to get bmiss stats
363  * @vdev: pointer to vdev object
364  * @bmiss_peer_mac: mac address of the peer
365  * @errno: error code
366  *
367  * Return: pointer to infra cp stats event for success or NULL for failure
368  */
369 struct infra_cp_stats_event*
370 wlan_cfg80211_mc_bmiss_get_infra_cp_stats(
371 				struct wlan_objmgr_vdev *vdev,
372 				uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE],
373 				int *errno);
374 #else /* CONFIG_WLAN_BMISS */
375 static inline struct infra_cp_stats_event*
wlan_cfg80211_mc_bmiss_get_infra_cp_stats(struct wlan_objmgr_vdev * vdev,uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE],int * errno)376 wlan_cfg80211_mc_bmiss_get_infra_cp_stats(
377 				struct wlan_objmgr_vdev *vdev,
378 				uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE],
379 				int *errno)
380 {
381 	return NULL;
382 }
383 #endif /* CONFIG_WLAN_BMISS */
384 
385 /**
386  * wlan_cp_stats_update_chan_info() - API to update chan stats
387  * @psoc: pointer to psoc
388  * @chan_stat: channel stats
389  * @vdev_id: vdev id
390  *
391  * Return: None
392  */
393 void wlan_cp_stats_update_chan_info(struct wlan_objmgr_psoc *psoc,
394 				    struct channel_status *chan_stat,
395 				    uint8_t vdev_id);
396 
397 /**
398  * wlan_cp_stats_get_rx_clear_count() - API to get rx clear count for a channel
399  * @psoc: pointer to psoc
400  * @vdev_id: vdev id
401  * @req_freq: freq for which rx clear count require
402  *
403  * Return: channel load
404  */
405 uint8_t wlan_cp_stats_get_rx_clear_count(struct wlan_objmgr_psoc *psoc,
406 					 uint8_t vdev_id, qdf_freq_t req_freq);
407 
408 /**
409  * ucfg_mc_cp_stats_clear_channel_status() - API to clear chan stats
410  * @pdev: pointer to pdev object
411  *
412  * Return: None
413  */
414 void ucfg_mc_cp_stats_clear_channel_status(struct wlan_objmgr_pdev *pdev);
415 
416 /**
417  * ucfg_mc_cp_stats_get_channel_status() - API to get chan stats
418  * @pdev: pointer to pdev object
419  * @chan_freq: channel freq of which stats are needed
420  *
421  * Return: channel status
422  */
423 struct channel_status *
424 ucfg_mc_cp_stats_get_channel_status(struct wlan_objmgr_pdev *pdev,
425 				    uint32_t chan_freq);
426 #else /* QCA_SUPPORT_CP_STATS */
427 
ucfg_mc_cp_stats_register_pmo_handler(void)428 void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { };
ucfg_mc_cp_stats_send_stats_request(struct wlan_objmgr_vdev * vdev,enum stats_req_type type,struct request_info * info)429 static inline QDF_STATUS ucfg_mc_cp_stats_send_stats_request(
430 				struct wlan_objmgr_vdev *vdev,
431 				enum stats_req_type type,
432 				struct request_info *info)
433 {
434 	return QDF_STATUS_SUCCESS;
435 }
436 
ucfg_mc_cp_stats_set_rate_flags(struct wlan_objmgr_vdev * vdev,uint32_t flags)437 static inline QDF_STATUS ucfg_mc_cp_stats_set_rate_flags(
438 				struct wlan_objmgr_vdev *vdev,
439 				uint32_t flags)
440 {
441 	return QDF_STATUS_SUCCESS;
442 }
443 
ucfg_mc_cp_stats_get_psoc_wake_lock_stats(struct wlan_objmgr_psoc * psoc,struct wake_lock_stats * stats)444 static inline QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats(
445 						struct wlan_objmgr_psoc *psoc,
446 						struct wake_lock_stats *stats)
447 {
448 	return QDF_STATUS_SUCCESS;
449 }
450 
ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,enum qdf_proto_subtype protocol)451 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
452 					struct wlan_objmgr_psoc *psoc,
453 					uint8_t vdev_id,
454 					enum qdf_proto_subtype protocol)
455 {
456 	return QDF_STATUS_SUCCESS;
457 }
458 
ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint32_t reason)459 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(
460 				struct wlan_objmgr_psoc *psoc,
461 				uint8_t vdev_id,
462 				uint32_t reason)
463 {
464 	return QDF_STATUS_SUCCESS;
465 }
466 
ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t * dest_mac)467 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
468 					struct wlan_objmgr_psoc *psoc,
469 					uint8_t vdev_id, uint8_t *dest_mac)
470 {
471 	return QDF_STATUS_SUCCESS;
472 }
473 
ucfg_mc_cp_stats_get_vdev_wake_lock_stats(struct wlan_objmgr_vdev * vdev,struct wake_lock_stats * stats)474 static inline QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats(
475 						struct wlan_objmgr_vdev *vdev,
476 						struct wake_lock_stats *stats)
477 {
478 	return QDF_STATUS_SUCCESS;
479 }
480 
481 static inline
ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev * vdev,enum stats_req_type type,struct request_info * info)482 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
483 					    enum stats_req_type type,
484 					    struct request_info *info)
485 {
486 	return QDF_STATUS_SUCCESS;
487 }
488 
489 static inline void
ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc * psoc,bool enable)490 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
491 				   bool enable)
492 {}
493 
494 static inline void
ucfg_mc_cp_big_data_fw_support(struct wlan_objmgr_psoc * psoc,bool * enable)495 ucfg_mc_cp_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
496 			       bool *enable)
497 {}
498 
499 static inline struct infra_cp_stats_event*
wlan_cfg80211_mc_bmiss_get_infra_cp_stats(struct wlan_objmgr_vdev * vdev,uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE],int * errno)500 wlan_cfg80211_mc_bmiss_get_infra_cp_stats(
501 				struct wlan_objmgr_vdev *vdev,
502 				uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE],
503 				int *errno)
504 {
505 	return NULL;
506 }
507 
508 static inline void
ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev * vdev,int * dbm)509 ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev,
510 			      int *dbm)
511 {}
512 
513 static inline
wlan_cp_stats_update_chan_info(struct wlan_objmgr_psoc * psoc,struct channel_status * chan_stat,uint8_t vdev_id)514 void wlan_cp_stats_update_chan_info(struct wlan_objmgr_psoc *psoc,
515 				    struct channel_status *chan_stat,
516 				    uint8_t vdev_id)
517 {
518 }
519 
520 static inline
wlan_cp_stats_get_rx_clear_count(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,qdf_freq_t req_freq)521 uint8_t wlan_cp_stats_get_rx_clear_count(struct wlan_objmgr_psoc *psoc,
522 					 uint8_t vdev_id, qdf_freq_t req_freq)
523 {
524 }
525 
526 static inline
ucfg_mc_cp_stats_clear_channel_status(struct wlan_objmgr_pdev * pdev)527 void ucfg_mc_cp_stats_clear_channel_status(struct wlan_objmgr_pdev *pdev)
528 {
529 }
530 
531 static inline struct channel_status *
ucfg_mc_cp_stats_get_channel_status(struct wlan_objmgr_pdev * pdev,uint32_t chan_freq)532 ucfg_mc_cp_stats_get_channel_status(struct wlan_objmgr_pdev *pdev,
533 				    uint32_t chan_freq)
534 {
535 	return NULL;
536 }
537 #endif /* QCA_SUPPORT_CP_STATS */
538 #endif /* __WLAN_CP_STATS_MC_UCFG_API_H__ */
539