xref: /wlan-dirver/qcacld-3.0/core/hdd/src/wlan_hdd_stats.h (revision 522f7f2a380901f03280351179c17096d70d465a)
1 /*
2  * Copyright (c) 2012-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_hdd_stats.h
22  *
23  * WLAN Host Device Driver statistics related implementation
24  *
25  */
26 
27 #if !defined(WLAN_HDD_STATS_H)
28 #define WLAN_HDD_STATS_H
29 
30 #include "wlan_hdd_main.h"
31 #ifdef WLAN_FEATURE_11BE_MLO
32 #include "wlan_mlo_mgr_cmn.h"
33 #endif
34 
35 #define INVALID_MCS_IDX 255
36 
37 #define DATA_RATE_11AC_MCS_MASK    0x03
38 
39 #ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
40 /* LL stats get request time out value */
41 #define WLAN_WAIT_TIME_LL_STATS 3300
42 #else
43 #define WLAN_WAIT_TIME_LL_STATS 800
44 #endif
45 
46 #define WLAN_HDD_TGT_NOISE_FLOOR_DBM     (-128)
47 
48 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
49 extern const struct nla_policy qca_wlan_vendor_ll_ext_policy[
50 			QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX + 1];
51 
52 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR */
53 extern const struct nla_policy qca_wlan_vendor_ll_clr_policy[
54 			QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX + 1];
55 
56 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET */
57 extern const struct nla_policy qca_wlan_vendor_ll_set_policy[
58 			QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX + 1];
59 
60 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET */
61 extern const struct nla_policy qca_wlan_vendor_ll_get_policy[
62 			QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX + 1];
63 
64 #define FEATURE_LL_STATS_VENDOR_COMMANDS                                \
65 {                                                                       \
66 	.info.vendor_id = QCA_NL80211_VENDOR_ID,                        \
67 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR,          \
68 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |                           \
69 		WIPHY_VENDOR_CMD_NEED_NETDEV |                          \
70 		WIPHY_VENDOR_CMD_NEED_RUNNING,                          \
71 	.doit = wlan_hdd_cfg80211_ll_stats_clear,                       \
72 	vendor_command_policy(qca_wlan_vendor_ll_clr_policy,            \
73 			      QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX)    \
74 },                                                                      \
75 									\
76 {                                                                       \
77 	.info.vendor_id = QCA_NL80211_VENDOR_ID,                        \
78 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET,          \
79 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |                           \
80 		 WIPHY_VENDOR_CMD_NEED_NETDEV |                         \
81 		 WIPHY_VENDOR_CMD_NEED_RUNNING,                         \
82 	.doit = wlan_hdd_cfg80211_ll_stats_set,                         \
83 	vendor_command_policy(qca_wlan_vendor_ll_set_policy,            \
84 			      QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX)    \
85 },                                                                      \
86                                                                         \
87 {                                                                       \
88 	.info.vendor_id = QCA_NL80211_VENDOR_ID,                        \
89 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET,          \
90 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |                           \
91 		 WIPHY_VENDOR_CMD_NEED_NETDEV |                         \
92 		 WIPHY_VENDOR_CMD_NEED_RUNNING,                         \
93 	.doit = wlan_hdd_cfg80211_ll_stats_get,                         \
94 	vendor_command_policy(qca_wlan_vendor_ll_get_policy,            \
95 			      QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX)    \
96 },
97 #else
98 #define FEATURE_LL_STATS_VENDOR_COMMANDS
99 #endif
100 
101 /**
102  * struct index_vht_data_rate_type - vht data rate type
103  * @beacon_rate_index: Beacon rate index
104  * @supported_VHT80_rate: VHT80 rate
105  * @supported_VHT40_rate: VHT40 rate
106  * @supported_VHT20_rate: VHT20 rate
107  */
108 struct index_vht_data_rate_type {
109 	uint8_t beacon_rate_index;
110 	uint16_t supported_VHT80_rate[2];
111 	uint16_t supported_VHT40_rate[2];
112 	uint16_t supported_VHT20_rate[2];
113 };
114 
115 /**
116  * enum data_rate_11ac_max_mcs - possible VHT max MCS values
117  * @DATA_RATE_11AC_MAX_MCS_7: MCS7 rate
118  * @DATA_RATE_11AC_MAX_MCS_8: MCS8 rate
119  * @DATA_RATE_11AC_MAX_MCS_9: MCS9 rate
120  * @DATA_RATE_11AC_MAX_MCS_NA: Not applicable
121  */
122 enum data_rate_11ac_max_mcs {
123 	DATA_RATE_11AC_MAX_MCS_7,
124 	DATA_RATE_11AC_MAX_MCS_8,
125 	DATA_RATE_11AC_MAX_MCS_9,
126 	DATA_RATE_11AC_MAX_MCS_NA
127 };
128 
129 /**
130  * struct index_data_rate_type - non vht data rate type
131  * @beacon_rate_index: Beacon rate index
132  * @supported_rate: Supported rate table
133  */
134 struct index_data_rate_type {
135 	uint8_t beacon_rate_index;
136 	uint16_t supported_rate[4];
137 };
138 
139 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
140 
141 /**
142  * wlan_hdd_cfg80211_ll_stats_set() - set link layer stats
143  * @wiphy: Pointer to wiphy
144  * @wdev: Pointer to wdev
145  * @data: Pointer to data
146  * @data_len: Data length
147  *
148  * Return: int
149  */
150 int wlan_hdd_cfg80211_ll_stats_set(struct wiphy *wiphy,
151 				   struct wireless_dev *wdev,
152 				   const void *data,
153 				   int data_len);
154 
155 /**
156  * wlan_hdd_cfg80211_ll_stats_get() - get link layer stats
157  * @wiphy: Pointer to wiphy
158  * @wdev: Pointer to wdev
159  * @data: Pointer to data
160  * @data_len: Data length
161  *
162  * Return: int
163  */
164 int wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy,
165 				   struct wireless_dev *wdev,
166 				   const void *data,
167 				   int data_len);
168 
169 
170 /**
171  * wlan_hdd_cfg80211_ll_stats_clear() - clear link layer stats
172  * @wiphy: Pointer to wiphy
173  * @wdev: Pointer to wdev
174  * @data: Pointer to data
175  * @data_len: Data length
176  *
177  * Return: int
178  */
179 int wlan_hdd_cfg80211_ll_stats_clear(struct wiphy *wiphy,
180 				     struct wireless_dev *wdev,
181 				     const void *data,
182 				     int data_len);
183 
184 void wlan_hdd_clear_link_layer_stats(struct hdd_adapter *adapter);
185 
186 static inline bool hdd_link_layer_stats_supported(void)
187 {
188 	return true;
189 }
190 
191 /**
192  * wlan_hdd_cfg80211_ll_stats_ext_set_param() - config monitor parameters
193  * @wiphy: wiphy handle
194  * @wdev: wdev handle
195  * @data: user layer input
196  * @data_len: length of user layer input
197  *
198  * return: 0 success, einval failure
199  */
200 int wlan_hdd_cfg80211_ll_stats_ext_set_param(struct wiphy *wiphy,
201 					     struct wireless_dev *wdev,
202 					     const void *data,
203 					     int data_len);
204 /**
205  * hdd_get_interface_info() - get interface info
206  * @link_info: Link info pointer in HDD adapter
207  * @info: Pointer to interface info
208  *
209  * Return: bool
210  */
211 bool hdd_get_interface_info(struct wlan_hdd_link_info *link_info,
212 			    struct wifi_interface_info *info);
213 
214 /**
215  * wlan_hdd_ll_stats_get() - Get Link Layer statistics from FW
216  * @link_info: Link info pointer in HDD adapter
217  * @req_id: request id
218  * @req_mask: bitmask used by FW for the request
219  *
220  * Return: 0 on success and error code otherwise
221  */
222 int wlan_hdd_ll_stats_get(struct wlan_hdd_link_info *link_info,
223 			  uint32_t req_id, uint32_t req_mask);
224 
225 /**
226  * wlan_hdd_cfg80211_link_layer_stats_callback() - This function is called
227  * @hdd_handle: Handle to HDD context
228  * @indication_type: Indication type
229  * @results: Pointer to results
230  * @cookie: Callback context
231  *
232  * After receiving Link Layer indications from FW.This callback converts the
233  * firmware data to the NL data and send the same to the kernel/upper layers.
234  *
235  * Return: None
236  */
237 void wlan_hdd_cfg80211_link_layer_stats_callback(hdd_handle_t hdd_handle,
238 						 int indication_type,
239 						 tSirLLStatsResults *results,
240 						 void *cookie);
241 
242 /**
243  * wlan_hdd_cfg80211_link_layer_stats_ext_callback() - Callback for LL ext
244  * @ctx: HDD context
245  * @rsp: msg from FW
246  *
247  * This function is an extension of
248  * wlan_hdd_cfg80211_link_layer_stats_callback. It converts
249  * monitoring parameters offloaded to NL data and send the same to the
250  * kernel/upper layers.
251  *
252  * Return: None.
253  */
254 void wlan_hdd_cfg80211_link_layer_stats_ext_callback(hdd_handle_t ctx,
255 						     tSirLLStatsResults *rsp);
256 
257 /**
258  * hdd_lost_link_info_cb() - callback function to get lost link information
259  * @hdd_handle: Opaque handle for the HDD context
260  * @lost_link_info: lost link information
261  *
262  * Return: none
263  */
264 void hdd_lost_link_info_cb(hdd_handle_t hdd_handle,
265 			   struct sir_lost_link_info *lost_link_info);
266 
267 #else /* WLAN_FEATURE_LINK_LAYER_STATS */
268 
269 static inline bool hdd_link_layer_stats_supported(void)
270 {
271 	return false;
272 }
273 
274 static inline int
275 wlan_hdd_cfg80211_ll_stats_ext_set_param(struct wiphy *wiphy,
276 					 struct wireless_dev *wdev,
277 					 const void *data,
278 					 int data_len)
279 {
280 	return -EINVAL;
281 }
282 
283 static inline int
284 wlan_hdd_ll_stats_get(struct wlan_hdd_link_info *link_info,
285 		      uint32_t req_id, uint32_t req_mask)
286 {
287 	return -EINVAL;
288 }
289 
290 static inline void
291 wlan_hdd_clear_link_layer_stats(struct hdd_adapter *adapter)
292 {
293 }
294 
295 static inline void
296 wlan_hdd_cfg80211_link_layer_stats_callback(hdd_handle_t hdd_handle,
297 					    int indication_type,
298 					    tSirLLStatsResults *results,
299 					    void *cookie)
300 {
301 }
302 
303 static inline void
304 wlan_hdd_cfg80211_link_layer_stats_ext_callback(hdd_handle_t ctx,
305 						tSirLLStatsResults *rsp)
306 {
307 }
308 
309 static inline void
310 hdd_lost_link_info_cb(hdd_handle_t hdd_handle,
311 		      struct sir_lost_link_info *lost_link_info)
312 {
313 }
314 
315 #endif /* End of WLAN_FEATURE_LINK_LAYER_STATS */
316 
317 #ifdef WLAN_FEATURE_STATS_EXT
318 /**
319  * wlan_hdd_cfg80211_stats_ext_request() - ext stats request
320  * @wiphy: Pointer to wiphy
321  * @wdev: Pointer to wdev
322  * @data: Pointer to data
323  * @data_len: Data length
324  *
325  * Return: int
326  */
327 int wlan_hdd_cfg80211_stats_ext_request(struct wiphy *wiphy,
328 					struct wireless_dev *wdev,
329 					const void *data,
330 					int data_len);
331 
332 #endif /* End of WLAN_FEATURE_STATS_EXT */
333 
334 /**
335  * wlan_hdd_cfg80211_connected_chan_stats_req() - get currently connected
336  * channel statistics from driver/firmware
337  * @wiphy: Pointer to wiphy
338  * @wdev: Pointer to wdev
339  * @data: Pointer to data
340  * @data_len: Data length
341  *
342  * Return: int
343  */
344 int wlan_hdd_cfg80211_connected_chan_stats_req(struct wiphy *wiphy,
345 					       struct wireless_dev *wdev,
346 					       const void *data,
347 					       int data_len);
348 
349 /**
350  * wlan_hdd_cfg80211_get_station() - get station statistics
351  * @wiphy: Pointer to wiphy
352  * @dev: Pointer to network device
353  * @mac: Pointer to mac
354  * @sinfo: Pointer to station info
355  *
356  * Return: 0 for success, non-zero for failure
357  */
358 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
359 int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
360 				  struct net_device *dev, const uint8_t *mac,
361 				  struct station_info *sinfo);
362 #else
363 int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
364 				  struct net_device *dev, uint8_t *mac,
365 				  struct station_info *sinfo);
366 #endif
367 
368 /**
369  * wlan_hdd_cfg80211_dump_station() - dump station statistics
370  * @wiphy: Pointer to wiphy
371  * @dev: Pointer to network device
372  * @idx: variable to determine whether to get stats or not
373  * @mac: Pointer to mac
374  * @sinfo: Pointer to station info
375  *
376  * Return: 0 for success, non-zero for failure
377  */
378 int wlan_hdd_cfg80211_dump_station(struct wiphy *wiphy,
379 				struct net_device *dev,
380 				int idx, u8 *mac,
381 				struct station_info *sinfo);
382 
383 struct net_device_stats *hdd_get_stats(struct net_device *dev);
384 
385 int wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy,
386 				  struct net_device *dev,
387 				  int idx, struct survey_info *survey);
388 
389 void hdd_display_hif_stats(void);
390 void hdd_clear_hif_stats(void);
391 
392 /**
393  * wlan_hdd_cfg80211_stats_ext_callback() - ext stats callback
394  * @hdd_handle: Opaque handle to HDD context
395  * @data: ext stats payload
396  *
397  * Return: nothing
398  */
399 void wlan_hdd_cfg80211_stats_ext_callback(hdd_handle_t hdd_handle,
400 					  struct stats_ext_event *data);
401 
402 /**
403  * wlan_hdd_cfg80211_stats_ext2_callback() - stats_ext2_callback
404  * @hdd_handle: opaque handle to the hdd context
405  * @pmsg: sir_sme_rx_aggr_hole_ind
406  *
407  * Return: void
408  */
409 void
410 wlan_hdd_cfg80211_stats_ext2_callback(hdd_handle_t hdd_handle,
411 				      struct sir_sme_rx_aggr_hole_ind *pmsg);
412 
413 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
414 /**
415  * wlan_hdd_cfg80211_roam_events_callback() - roam_events_callback
416  * @roam_stats: roam events stats
417  * @idx: TLV index in roam stats event
418  *
419  * Return: void
420  */
421 void
422 wlan_hdd_cfg80211_roam_events_callback(struct roam_stats_event *roam_stats,
423 				       uint8_t idx);
424 #endif /* End of WLAN_FEATURE_ROAM_OFFLOAD */
425 
426 /**
427  * wlan_hdd_get_rcpi() - Wrapper to get current RCPI
428  * @adapter: adapter upon which the measurement is requested
429  * @mac: peer addr for which measurement is requested
430  * @rcpi_value: pointer to where the RCPI should be returned
431  * @measurement_type: type of rcpi measurement
432  *
433  * This is a wrapper function for getting RCPI, invoke this function only
434  * when rcpi support is enabled in firmware
435  *
436  * Return: 0 for success, non-zero for failure
437  */
438 int wlan_hdd_get_rcpi(struct hdd_adapter *adapter, uint8_t *mac,
439 		      int32_t *rcpi_value,
440 		      enum rcpi_measurement_type measurement_type);
441 
442 #ifdef WLAN_FEATURE_MIB_STATS
443 /**
444  * wlan_hdd_get_mib_stats() - Get the mib statistics
445  * @adapter: adapter upon which the measurement is requested
446  *
447  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
448  */
449 QDF_STATUS wlan_hdd_get_mib_stats(struct hdd_adapter *adapter);
450 #endif
451 
452 /**
453  * wlan_hdd_get_rssi() - Get the current RSSI
454  * @link_info: Link info pointer in HDD adapter
455  * @rssi_value: pointer to where the RSSI should be returned
456  *
457  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
458  */
459 QDF_STATUS wlan_hdd_get_rssi(struct wlan_hdd_link_info *link_info,
460 			     int8_t *rssi_value);
461 
462 /**
463  * wlan_hdd_get_snr() - Get the current SNR
464  * @link_info: Link info pointer in HDD adapter
465  * @snr: pointer to where the SNR should be returned
466  *
467  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
468  */
469 QDF_STATUS wlan_hdd_get_snr(struct wlan_hdd_link_info *link_info, int8_t *snr);
470 
471 /**
472  * wlan_hdd_get_linkspeed_for_peermac() - Get link speed for a peer
473  * @link_info: Link info pointer in adapter
474  * @mac_address: MAC address of the peer
475  * @linkspeed: pointer to memory where returned link speed is to be placed
476  *
477  * This function will send a query to SME for the linkspeed of the
478  * given peer, and then wait for the callback to be invoked.
479  *
480  * Return: 0 if linkspeed data is available, negative errno otherwise
481  */
482 int wlan_hdd_get_linkspeed_for_peermac(struct wlan_hdd_link_info *link_info,
483 				       struct qdf_mac_addr *mac_address,
484 				       uint32_t *linkspeed);
485 
486 /**
487  * wlan_hdd_get_link_speed() - get link speed
488  * @link_info: Link info pointer in HDD adapter
489  * @link_speed:   pointer to link speed
490  *
491  * This function fetches per bssid link speed.
492  *
493  * Return: if associated, link speed shall be returned.
494  *         if not associated, link speed of 0 is returned.
495  *         On error, error number will be returned.
496  */
497 int wlan_hdd_get_link_speed(struct wlan_hdd_link_info *link_info,
498 			    uint32_t *link_speed);
499 
500 #ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
501 /**
502  * wlan_hdd_get_peer_rx_rate_stats() - STA gets rx rate stats
503  * @link_info: Link info pointer in HDD adapter
504  *
505  * STA gets rx rate stats through using the existed API
506  * cdp_host_get_peer_stats. The reason that we make this
507  * function is to avoid being disrupted by the flag
508  * "get_station_fw_request_needed"
509  *
510  * Return: void
511  */
512 void wlan_hdd_get_peer_rx_rate_stats(struct wlan_hdd_link_info *link_info);
513 #else
514 static inline void
515 wlan_hdd_get_peer_rx_rate_stats(struct wlan_hdd_link_info *link_info)
516 {
517 }
518 #endif
519 
520 /**
521  * wlan_hdd_get_station_stats() - Get station statistics
522  * @link_info: Link info pointer in HDD adapter.
523  *
524  * Return: status of operation
525  */
526 int wlan_hdd_get_station_stats(struct wlan_hdd_link_info *link_info);
527 
528 int wlan_hdd_qmi_get_sync_resume(void);
529 int wlan_hdd_qmi_put_suspend(void);
530 
531 #ifdef WLAN_FEATURE_BIG_DATA_STATS
532 /**
533  * wlan_hdd_get_big_data_station_stats() - Get big data station statistics
534  * @link_info: Link info pointer in HDD adapter
535  *
536  * Return: status of operation
537  */
538 int wlan_hdd_get_big_data_station_stats(struct wlan_hdd_link_info *link_info);
539 
540 /**
541  * wlan_cfg80211_mc_cp_get_big_data_stats() - API to get big data
542  * statistics from firmware
543  * @vdev:    Pointer to vdev
544  * @errno:   error type in case of failure
545  *
546  * Return: big data stats buffer on success, Null on failure
547  */
548 struct big_data_stats_event *
549 wlan_cfg80211_mc_cp_get_big_data_stats(struct wlan_objmgr_vdev *vdev,
550 				       int *errno);
551 
552 /**
553  * wlan_cfg80211_mc_cp_stats_free_big_data_stats_event() - API to release big
554  * data statistics buffer
555  * @info:    pointer to object to populate with big data stats
556  *
557  * Return: None
558  */
559 void wlan_cfg80211_mc_cp_stats_free_big_data_stats_event(
560 					struct big_data_stats_event *info);
561 #else
562 static inline int
563 wlan_hdd_get_big_data_station_stats(struct wlan_hdd_link_info *link_info)
564 {
565 	return 0;
566 }
567 
568 static inline struct big_data_stats_event *
569 wlan_cfg80211_mc_cp_get_big_data_stats(struct wlan_objmgr_vdev *vdev,
570 				       int *errno)
571 {
572 	return 0;
573 }
574 
575 static inline
576 void wlan_cfg80211_mc_cp_stats_free_big_data_stats_event(
577 					struct big_data_stats_event *info)
578 {
579 }
580 #endif
581 
582 /**
583  * wlan_hdd_get_temperature() - get current device temperature
584  * @adapter: device upon which the request was made
585  * @temperature: pointer to where the temperature is to be returned
586  *
587  * Return: 0 if a temperature value (either current or cached) was
588  * returned, otherwise a negative errno is returned.
589  *
590  */
591 int wlan_hdd_get_temperature(struct hdd_adapter *adapter, int *temperature);
592 
593 /**
594  * hdd_get_max_tx_bitrate() - Get the max tx bitrate of the AP
595  * @link_info: pointer to link_info struct in adapter
596  *
597  * This function gets the MAX supported rate by AP and cache
598  * it into connection info structure
599  *
600  * Return: None
601  */
602 void hdd_get_max_tx_bitrate(struct wlan_hdd_link_info *link_info);
603 
604 #ifdef TX_MULTIQ_PER_AC
605 /**
606  * wlan_hdd_display_tx_multiq_stats() - display Tx multi queue stats
607  * @context: hdd context
608  * @netdev: netdev
609  *
610  * Return: none
611  */
612 void wlan_hdd_display_tx_multiq_stats(hdd_cb_handle context,
613 				      qdf_netdev_t netdev);
614 #else
615 static inline
616 void wlan_hdd_display_tx_multiq_stats(hdd_cb_handle context,
617 				      qdf_netdev_t netdev)
618 {
619 }
620 #endif
621 
622 /**
623  * hdd_report_max_rate() - Fill the max rate stats in the station info structure
624  * to be sent to the userspace.
625  * @link_info: pointer to link_info struct in adapter
626  * @mac_handle: The mac handle
627  * @rate: The station_info tx/rx rate to be filled
628  * @signal: signal from station_info
629  * @rate_flags: TX/RX rate flags computed from tx/rx rate
630  * @mcs_index: The TX/RX mcs index computed from tx/rx rate
631  * @fw_rate: The tx/rx rate from fw stats
632  * @nss: The TX/RX NSS from fw stats
633  *
634  * Return: True if fill is successful
635  */
636 bool hdd_report_max_rate(struct wlan_hdd_link_info *link_info,
637 			 mac_handle_t mac_handle,
638 			 struct rate_info *rate,
639 			 int8_t signal,
640 			 enum tx_rate_info rate_flags,
641 			 uint8_t mcs_index,
642 			 uint16_t fw_rate, uint8_t nss);
643 
644 /**
645  * hdd_check_and_update_nss() - Check and update NSS as per DBS capability
646  * @hdd_ctx: HDD Context pointer
647  * @tx_nss: pointer to variable storing the tx_nss
648  * @rx_nss: pointer to variable storing the rx_nss
649  *
650  * The parameters include the NSS obtained from the FW or static NSS. This NSS
651  * could be invalid in the case the current HW mode is DBS where the connection
652  * are 1x1. Rectify these NSS values as per the current HW mode.
653  *
654  * Return: none
655  */
656 void hdd_check_and_update_nss(struct hdd_context *hdd_ctx,
657 			      uint8_t *tx_nss, uint8_t *rx_nss);
658 #ifdef QCA_SUPPORT_CP_STATS
659 /**
660  * wlan_hdd_register_cp_stats_cb() - Register hdd stats specific
661  * callbacks to the cp stats component
662  * @hdd_ctx: hdd context
663  *
664  * Return: none
665  */
666 
667 void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx);
668 #else
669 static inline void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx) {}
670 #endif
671 
672 #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(WLAN_FEATURE_ROAM_INFO_STATS)
673 #define FEATURE_ROAM_STATS_COMMANDS	\
674 	{	\
675 	.info.vendor_id = QCA_NL80211_VENDOR_ID,	\
676 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS,	\
677 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |	\
678 		 WIPHY_VENDOR_CMD_NEED_NETDEV |	\
679 		 WIPHY_VENDOR_CMD_NEED_RUNNING,	\
680 	.doit = wlan_hdd_cfg80211_get_roam_stats,	\
681 	vendor_command_policy(VENDOR_CMD_RAW_DATA, 0)	\
682 	},	\
683 
684 #define FEATURE_ROAM_STATS_EVENTS	\
685 	[QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX] = {	\
686 		.vendor_id = QCA_NL80211_VENDOR_ID,	\
687 		.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS,	\
688 	},	\
689 
690 /**
691  * wlan_hdd_cfg80211_get_roam_stats() - get roam statstics information
692  * @wiphy: wiphy pointer
693  * @wdev: pointer to struct wireless_dev
694  * @data: pointer to incoming NL vendor data
695  * @data_len: length of @data
696  *
697  * Return: 0 on success; error number otherwise.
698  */
699 int wlan_hdd_cfg80211_get_roam_stats(struct wiphy *wiphy,
700 				     struct wireless_dev *wdev,
701 				     const void *data,
702 				     int data_len);
703 #else
704 #define FEATURE_ROAM_STATS_COMMANDS
705 #define FEATURE_ROAM_STATS_EVENTS
706 #endif
707 
708 #ifdef WLAN_FEATURE_TX_LATENCY_STATS
709 /**
710  * hdd_tx_latency_register_cb() - register callback function for transmit
711  * latency stats
712  * @soc: pointer to soc context
713  *
714  * Return: QDF_STATUS
715  */
716 QDF_STATUS hdd_tx_latency_register_cb(void *soc);
717 
718 /**
719  * hdd_tx_latency_restore_config() - restore tx latency stats config for a link
720  * @link_info: link specific information
721  *
722  * Return: QDF_STATUS
723  */
724 QDF_STATUS
725 hdd_tx_latency_restore_config(struct wlan_hdd_link_info *link_info);
726 
727 /**
728  * wlan_hdd_cfg80211_tx_latency - configure/retrieve per-link transmit latency
729  * statistics
730  * @wiphy: wiphy handle
731  * @wdev: wdev handle
732  * @data: user layer input
733  * @data_len: length of user layer input
734  *
735  * return: 0 success, einval failure
736  */
737 int wlan_hdd_cfg80211_tx_latency(struct wiphy *wiphy,
738 				 struct wireless_dev *wdev,
739 				 const void *data, int data_len);
740 
741 /**
742  * hdd_tx_latency_record_ingress_ts() - Record driver ingress timestamp in CB
743  * @adapter: pointer to hdd vdev/net_device context
744  * @skb: sk buff
745  *
746  * Return: None
747  */
748 static inline void
749 hdd_tx_latency_record_ingress_ts(struct hdd_adapter *adapter,
750 				 struct sk_buff *skb)
751 {
752 	if (adapter->tx_latency_cfg.enable)
753 		qdf_nbuf_set_tx_ts(skb);
754 }
755 
756 extern const struct nla_policy
757 	tx_latency_policy[QCA_WLAN_VENDOR_ATTR_TX_LATENCY_MAX + 1];
758 
759 #define FEATURE_TX_LATENCY_STATS_COMMANDS	\
760 	{	\
761 	.info.vendor_id = QCA_NL80211_VENDOR_ID,	\
762 	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY,	\
763 	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |	\
764 		 WIPHY_VENDOR_CMD_NEED_NETDEV |	\
765 		 WIPHY_VENDOR_CMD_NEED_RUNNING,	\
766 	.doit = wlan_hdd_cfg80211_tx_latency,	\
767 	vendor_command_policy(tx_latency_policy,	\
768 			      QCA_WLAN_VENDOR_ATTR_TX_LATENCY_MAX)	\
769 	},	\
770 
771 #define FEATURE_TX_LATENCY_STATS_EVENTS	\
772 	[QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY_INDEX] = {	\
773 		.vendor_id = QCA_NL80211_VENDOR_ID,	\
774 		.subcmd = QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY,	\
775 	},	\
776 
777 #else
778 static inline QDF_STATUS hdd_tx_latency_register_cb(void *soc)
779 {
780 	return QDF_STATUS_SUCCESS;
781 }
782 
783 static inline QDF_STATUS
784 hdd_tx_latency_restore_config(struct wlan_hdd_link_info *link_info)
785 {
786 	return QDF_STATUS_SUCCESS;
787 }
788 
789 static inline void
790 hdd_tx_latency_record_ingress_ts(struct hdd_adapter *adapter,
791 				 struct sk_buff *skb)
792 {
793 }
794 
795 #define FEATURE_TX_LATENCY_STATS_COMMANDS
796 #define FEATURE_TX_LATENCY_STATS_EVENTS
797 #endif
798 #endif /* end #if !defined(WLAN_HDD_STATS_H) */
799