1 /*
2  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-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_defs.h
22  *
23  * This file provide definition for structure/enums/defines related to control
24  * path stats component
25  */
26 
27 #ifndef __WLAN_CP_STATS_MC_DEFS_H__
28 #define __WLAN_CP_STATS_MC_DEFS_H__
29 
30 #include "wlan_cmn.h"
31 #include "qdf_event.h"
32 /* For WMI_MAX_CHAINS */
33 #include "wmi_unified.h"
34 #include "wlan_mlo_mgr_cmn.h"
35 
36 #ifdef QCA_SUPPORT_MC_CP_STATS
37 #include "wlan_cp_stats_public_structs.h"
38 #endif
39 
40 #ifdef WLAN_SUPPORT_TWT
41 
42 #include <wmi_unified_twt_param.h>
43 /* Max TWT sessions per peer (supported by fw) */
44 #define TWT_PEER_MAX_SESSIONS 1
45 
46 #endif /* WLAN_SUPPORT_TWT */
47 
48 #define MAX_NUM_CHAINS              2
49 
50 #define MAX_MIB_STATS               1
51 
52 #define IS_MSB_SET(__num) ((__num) & BIT(31))
53 #define IS_LSB_SET(__num) ((__num) & BIT(0))
54 
55 #define VDEV_ALL                    0xFF
56 
57 /**
58  * enum stats_req_type - enum indicating bit position of various stats type in
59  * request map
60  * @TYPE_CONNECTION_TX_POWER: tx power was requested
61  * @TYPE_STATION_STATS: station stats was requested
62  * @TYPE_PEER_STATS: peer stats was requested
63  * @TYPE_MIB_STATS: MIB stats was requested
64  * @TYPE_PEER_STATS_INFO_EXT: peer stats info ext was requested
65  * @TYPE_CONGESTION_STATS: congestion stats was requested
66  * @TYPE_BIG_DATA_STATS: big data stats was requested
67  * @TYPE_MAX: maximum value
68  */
69 enum stats_req_type {
70 	TYPE_CONNECTION_TX_POWER = 0,
71 	TYPE_STATION_STATS,
72 	TYPE_PEER_STATS,
73 	TYPE_MIB_STATS,
74 	TYPE_PEER_STATS_INFO_EXT,
75 	TYPE_CONGESTION_STATS,
76 	TYPE_BIG_DATA_STATS,
77 	TYPE_MAX,
78 };
79 
80 /**
81  * enum tx_rate_info - tx rate flags
82  * @TX_RATE_LEGACY: Legacy rates
83  * @TX_RATE_HT20: HT20 rates
84  * @TX_RATE_HT40: HT40 rates
85  * @TX_RATE_SGI: Rate with Short guard interval
86  * @TX_RATE_LGI: Rate with Long guard interval
87  * @TX_RATE_VHT20: VHT 20 rates
88  * @TX_RATE_VHT40: VHT 40 rates
89  * @TX_RATE_VHT80: VHT 80 rates
90  * @TX_RATE_HE20: HE 20 rates
91  * @TX_RATE_HE40: HE 40 rates
92  * @TX_RATE_HE80: HE 80 rates
93  * @TX_RATE_HE160: HE 160 rates
94  * @TX_RATE_VHT160: VHT 160 rates
95  * @TX_RATE_EHT20: EHT 20 rates
96  * @TX_RATE_EHT40: EHT 40 rates
97  * @TX_RATE_EHT80: EHT 80 rates
98  * @TX_RATE_EHT160: EHT 160 rates
99  * @TX_RATE_EHT320: EHT 320 rates
100  */
101 enum tx_rate_info {
102 	TX_RATE_LEGACY = 0x1,
103 	TX_RATE_HT20 = 0x2,
104 	TX_RATE_HT40 = 0x4,
105 	TX_RATE_SGI = 0x8,
106 	TX_RATE_LGI = 0x10,
107 	TX_RATE_VHT20 = 0x20,
108 	TX_RATE_VHT40 = 0x40,
109 	TX_RATE_VHT80 = 0x80,
110 	TX_RATE_HE20 = 0x100,
111 	TX_RATE_HE40 = 0x200,
112 	TX_RATE_HE80 = 0x400,
113 	TX_RATE_HE160 = 0x800,
114 	TX_RATE_VHT160 = 0x1000,
115 	TX_RATE_EHT20 = 0x2000,
116 	TX_RATE_EHT40 = 0x4000,
117 	TX_RATE_EHT80 = 0x8000,
118 	TX_RATE_EHT160 = 0x10000,
119 	TX_RATE_EHT320 = 0x20000,
120 };
121 
122 /**
123  * enum txrate_gi - Guard Intervals
124  * @TXRATE_GI_0_8_US: guard interval 0.8 us
125  * @TXRATE_GI_0_4_US: guard interval 0.4 us for legacy
126  * @TXRATE_GI_1_6_US: guard interval 1.6 us
127  * @TXRATE_GI_3_2_US: guard interval 3.2 us
128  */
129 enum txrate_gi {
130 	TXRATE_GI_0_8_US = 0,
131 	TXRATE_GI_0_4_US,
132 	TXRATE_GI_1_6_US,
133 	TXRATE_GI_3_2_US,
134 };
135 
136 /**
137  * struct wake_lock_stats - wake lock stats structure
138  * @ucast_wake_up_count:        Unicast wakeup count
139  * @bcast_wake_up_count:        Broadcast wakeup count
140  * @ipv4_mcast_wake_up_count:   ipv4 multicast wakeup count
141  * @ipv6_mcast_wake_up_count:   ipv6 multicast wakeup count
142  * @ipv6_mcast_ra_stats:        ipv6 multicast ra stats
143  * @ipv6_mcast_ns_stats:        ipv6 multicast ns stats
144  * @ipv6_mcast_na_stats:        ipv6 multicast na stats
145  * @icmpv4_count:               ipv4 icmp packet count
146  * @icmpv6_count:               ipv6 icmp packet count
147  * @rssi_breach_wake_up_count:  rssi breach wakeup count
148  * @low_rssi_wake_up_count:     low rssi wakeup count
149  * @gscan_wake_up_count:        gscan wakeup count
150  * @pno_complete_wake_up_count: pno complete wakeup count
151  * @pno_match_wake_up_count:    pno match wakeup count
152  * @oem_response_wake_up_count: oem response wakeup count
153  * @uc_drop_wake_up_count:      local data uc drop wakeup count
154  * @fatal_event_wake_up_count:  fatal event wakeup count
155  * @pwr_save_fail_detected:     pwr save fail detected wakeup count
156  * @scan_11d:                   11d scan wakeup count
157  * @mgmt_assoc: association request management frame
158  * @mgmt_disassoc: disassociation management frame
159  * @mgmt_assoc_resp: association response management frame
160  * @mgmt_reassoc: reassociate request management frame
161  * @mgmt_reassoc_resp: reassociate response management frame
162  * @mgmt_auth: authentication management frame
163  * @mgmt_deauth: deauthentication management frame
164  * @mgmt_action: action management frame
165  */
166 struct wake_lock_stats {
167 	uint32_t ucast_wake_up_count;
168 	uint32_t bcast_wake_up_count;
169 	uint32_t ipv4_mcast_wake_up_count;
170 	uint32_t ipv6_mcast_wake_up_count;
171 	uint32_t ipv6_mcast_ra_stats;
172 	uint32_t ipv6_mcast_ns_stats;
173 	uint32_t ipv6_mcast_na_stats;
174 	uint32_t icmpv4_count;
175 	uint32_t icmpv6_count;
176 	uint32_t rssi_breach_wake_up_count;
177 	uint32_t low_rssi_wake_up_count;
178 	uint32_t gscan_wake_up_count;
179 	uint32_t pno_complete_wake_up_count;
180 	uint32_t pno_match_wake_up_count;
181 	uint32_t oem_response_wake_up_count;
182 	uint32_t uc_drop_wake_up_count;
183 	uint32_t fatal_event_wake_up_count;
184 	uint32_t pwr_save_fail_detected;
185 	uint32_t scan_11d;
186 	uint32_t mgmt_assoc;
187 	uint32_t mgmt_disassoc;
188 	uint32_t mgmt_assoc_resp;
189 	uint32_t mgmt_reassoc;
190 	uint32_t mgmt_reassoc_resp;
191 	uint32_t mgmt_auth;
192 	uint32_t mgmt_deauth;
193 	uint32_t mgmt_action;
194 };
195 
196 struct stats_event;
197 
198 /**
199  * struct big_data_stats_event - big data stats event param
200  * @vdev_id:               vdev id
201  * @tsf_out_of_sync:       tsf out of sync
202  * @ani_level:             ani level
203  * @last_data_tx_pwr:  tx pwr last data frm
204  * @target_power_dsss:  tx power dsss
205  * @target_power_ofdm:  target power ofdm
206  * @last_tx_data_rix:     rx lateset data frame
207  * @last_tx_data_rate_kbps: tx latest data frame
208  */
209 struct big_data_stats_event {
210 	uint32_t vdev_id;
211 	uint32_t tsf_out_of_sync;
212 	int32_t ani_level;
213 	uint32_t last_data_tx_pwr;
214 	uint32_t target_power_dsss;
215 	uint32_t target_power_ofdm;
216 	uint32_t last_tx_data_rix;
217 	uint32_t last_tx_data_rate_kbps;
218 };
219 
220 /**
221  * struct medium_assess_data - medium assess data from firmware
222  * @part1_valid: the flag for part1 data, include cycle_count,
223  *    rx_clear_count and tx_frame_count
224  * @cycle_count: accumulative cycle count (total time)
225  * @rx_clear_count: accumulative rx clear count (busy time)
226  * @tx_frame_count: accumulative tx frame count (total time)
227  * @part2_valid: the flag for part2 data, include my_rx_count
228  * @my_rx_count: my RX count
229  */
230 struct medium_assess_data {
231 	bool part1_valid;
232 	uint32_t cycle_count;
233 	uint32_t rx_clear_count;
234 	uint32_t tx_frame_count;
235 	bool part2_valid;
236 	uint32_t my_rx_count;
237 };
238 
239 /**
240  * struct request_info: details of each request
241  * @cookie: identifier for os_if request
242  * @u: unified data type for callback to process tx power/peer rssi/
243  *     station stats/mib stats/peer stats request when response comes and
244  *     congestion notification callback.
245  * @vdev_id: vdev_id of request
246  * @pdev_id: pdev_id of request
247  * @peer_mac_addr: peer mac address
248  * @ml_vdev_info: mlo_stats_vdev_params structure
249  * @ml_peer_mac_addr: Array of ml peer mac addresses
250  */
251 struct request_info {
252 	void *cookie;
253 	union {
254 		void (*get_tx_power_cb)(int tx_power, void *cookie);
255 		void (*get_peer_rssi_cb)(struct stats_event *ev, void *cookie);
256 		void (*get_station_stats_cb)(struct stats_event *ev,
257 					     void *cookie);
258 		void (*get_mib_stats_cb)(struct stats_event *ev,
259 					 void *cookie);
260 		void (*get_peer_stats_cb)(struct stats_event *ev,
261 					  void *cookie);
262 		void (*congestion_notif_cb)(uint8_t vdev_id,
263 					  struct medium_assess_data *data,
264 					  bool last);
265 #ifdef WLAN_FEATURE_BIG_DATA_STATS
266 		void (*get_big_data_stats_cb)(struct big_data_stats_event *ev,
267 					      void *cookie);
268 #endif
269 	} u;
270 	uint32_t vdev_id;
271 	uint32_t pdev_id;
272 	uint8_t peer_mac_addr[QDF_MAC_ADDR_SIZE];
273 #ifdef WLAN_FEATURE_11BE_MLO
274 	struct mlo_stats_vdev_params ml_vdev_info;
275 	uint8_t ml_peer_mac_addr[WLAN_UMAC_MLO_MAX_VDEVS][QDF_MAC_ADDR_SIZE];
276 #endif
277 };
278 
279 /**
280  * struct pending_stats_requests: details of pending requests
281  * @type_map: map indicating type of outstanding requests
282  * @req: array of info for outstanding request of each type
283  */
284 struct pending_stats_requests {
285 	uint32_t type_map;
286 	struct request_info req[TYPE_MAX];
287 };
288 
289 /**
290  * struct cca_stats - cca stats
291  * @congestion: the congestion percentage = (busy_time/total_time)*100
292  *    for the interval from when the vdev was started to the current time
293  *    (or the time at which the vdev was stopped).
294  */
295 struct cca_stats {
296 	uint32_t congestion;
297 };
298 
299 /**
300  * struct psoc_mc_cp_stats: psoc specific stats
301  * @is_cp_stats_suspended: is cp stats suspended or not
302  * @pending: details of pending requests
303  * @wow_unspecified_wake_up_count: number of non-wow related wake ups
304  * @wow_stats: wake_lock stats for vdev
305  * @big_data_fw_support_enable: big data feature supported by fw or not
306  */
307 struct psoc_mc_cp_stats {
308 	bool is_cp_stats_suspended;
309 	struct pending_stats_requests pending;
310 	uint32_t wow_unspecified_wake_up_count;
311 	struct wake_lock_stats wow_stats;
312 #ifdef WLAN_FEATURE_BIG_DATA_STATS
313 	bool big_data_fw_support_enable;
314 #endif
315 };
316 
317 /**
318  * struct pdev_mc_cp_extd_stats - pdev extd stats
319  * @pdev_id: pdev id
320  * @my_rx_count: What portion of time, as measured by the MAC HW clock was
321  *               occupied, by receiving PPDUs addressed to one of the vdevs
322  *               within this pdev.
323  * @rx_matched_11ax_msdu_cnt: number of Rx 11ax MSDUs with matching BSS color
324  *                            counter updated at EOP (end of packet)
325  * @rx_other_11ax_msdu_cnt: number of Rx 11ax MSDUs with other BSS color counter
326  *                          updated at EOP (end of packet)
327  */
328 struct pdev_mc_cp_extd_stats {
329 	uint32_t pdev_id;
330 	uint32_t my_rx_count;
331 	uint32_t rx_matched_11ax_msdu_cnt;
332 	uint32_t rx_other_11ax_msdu_cnt;
333 };
334 
335 /* Max supported bandwidth is 320Mhz, so max 16 subbands for 20Mhz */
336 #define MAX_WIDE_BAND_SCAN_CHAN 16
337 
338 /**
339  * struct wide_band_scan_chan_info - wide band scan channel info
340  * @vdev_id: vdev id
341  * @num_chan: number of channels (for each subbands fo 20Mhz)
342  * @is_wide_band_scan: wide band scan or not
343  * @cca_busy_subband_info: CCA busy for each possible 20Mhz subbands
344  * of the wideband scan channel
345  */
346 struct wide_band_scan_chan_info {
347 	uint32_t vdev_id;
348 	uint8_t num_chan;
349 	bool is_wide_band_scan;
350 	uint32_t cca_busy_subband_info[MAX_WIDE_BAND_SCAN_CHAN];
351 };
352 
353 /**
354  * struct channel_status
355  * @channel_freq: Channel freq
356  * @noise_floor: Noise Floor value
357  * @rx_clear_count: rx clear count
358  * @cycle_count: cycle count
359  * @chan_tx_pwr_range: channel tx power per range in 0.5dBm steps
360  * @chan_tx_pwr_throughput: channel tx power per throughput
361  * @rx_frame_count: rx frame count (cumulative)
362  * @bss_rx_cycle_count: BSS rx cycle count
363  * @rx_11b_mode_data_duration: b-mode data rx time (units are microseconds)
364  * @tx_frame_count: BSS tx cycle count
365  * @mac_clk_mhz: sample frequency
366  * @channel_id: channel index
367  * @cmd_flags: indicate which stat event is this status coming from
368  * @subband_info: wide band scan channel info
369  */
370 struct channel_status {
371 	uint32_t    channel_freq;
372 	uint32_t    noise_floor;
373 	uint32_t    rx_clear_count;
374 	uint32_t    cycle_count;
375 	uint32_t    chan_tx_pwr_range;
376 	uint32_t    chan_tx_pwr_throughput;
377 	uint32_t    rx_frame_count;
378 	uint32_t    bss_rx_cycle_count;
379 	uint32_t    rx_11b_mode_data_duration;
380 	uint32_t    tx_frame_count;
381 	uint32_t    mac_clk_mhz;
382 	uint32_t    channel_id;
383 	uint32_t    cmd_flags;
384 	struct wide_band_scan_chan_info subband_info;
385 };
386 
387 /**
388  * struct per_channel_stats
389  * @total_channel: total number of be scanned channel
390  * @channel_status_list: channel status info store in this array
391  */
392 struct per_channel_stats {
393 	uint8_t total_channel;
394 	struct channel_status
395 		 channel_status_list[NUM_CHANNELS];
396 };
397 
398 /**
399  * struct pdev_mc_cp_stats: pdev specific stats
400  * @max_pwr: max tx power for pdev
401  * @pdev_id: pdev id
402  * @rx_clear_count: accumulative rx clear count (busy time) of pdev
403  * @cycle_count: accumulative cycle count (total time) of pdev
404  * @tx_frame_count: accumulative tx frame count (total time) of pdev
405  * @chan_stats: per channel info stats
406  */
407 struct pdev_mc_cp_stats {
408 	int32_t max_pwr;
409 	uint32_t pdev_id;
410 	uint32_t rx_clear_count;
411 	uint32_t cycle_count;
412 	uint32_t tx_frame_count;
413 	struct per_channel_stats chan_stats;
414 };
415 
416 /**
417  * struct summary_stats - summary stats
418  * @snr: snr of vdev
419  * @rssi: rssi of vdev
420  * @retry_cnt: retry count
421  * @multiple_retry_cnt: multiple_retry_cnt
422  * @tx_frm_cnt: num of tx frames
423  * @rx_frm_cnt: num of rx frames
424  * @frm_dup_cnt: duplicate frame count
425  * @fail_cnt: fail count
426  * @rts_fail_cnt: rts fail count
427  * @ack_fail_cnt: ack fail count
428  * @rts_succ_cnt: rts success count
429  * @rx_discard_cnt: rx frames discarded
430  * @rx_error_cnt: rx frames with error
431  */
432 struct summary_stats {
433 	uint32_t snr;
434 	int8_t rssi;
435 	uint32_t retry_cnt[4];
436 	uint32_t multiple_retry_cnt[4];
437 	uint32_t tx_frm_cnt[4];
438 	uint32_t rx_frm_cnt;
439 	uint32_t frm_dup_cnt;
440 	uint32_t fail_cnt[4];
441 	uint32_t rts_fail_cnt;
442 	uint32_t ack_fail_cnt;
443 	uint32_t rts_succ_cnt;
444 	uint32_t rx_discard_cnt;
445 	uint32_t rx_error_cnt;
446 };
447 
448 /**
449  * struct pmf_bcn_protect_stats - pmf bcn protect stats param
450  * @pmf_bcn_stats_valid: bcn protect stats received from fw are valid or not
451  * @igtk_mic_fail_cnt: MIC failure count of management packets using IGTK
452  * @igtk_replay_cnt: Replay detection count of management packets using IGTK
453  * @bcn_mic_fail_cnt: MIC failure count of beacon packets using BIGTK
454  * @bcn_replay_cnt: Replay detection count of beacon packets using BIGTK
455  */
456 struct pmf_bcn_protect_stats {
457 	bool pmf_bcn_stats_valid;
458 	uint32_t igtk_mic_fail_cnt;
459 	uint32_t igtk_replay_cnt;
460 	uint32_t bcn_mic_fail_cnt;
461 	uint32_t bcn_replay_cnt;
462 };
463 
464 /**
465  * struct vdev_summary_extd_stats - vdev summary extended stats
466  * @vdev_id: vdev_id of the event
467  * @is_mlo_vdev_active: is the mlo vdev currently active
468  * @vdev_tx_power: vdev tx power
469  */
470 struct vdev_summary_extd_stats {
471 	uint8_t vdev_id;
472 	bool is_mlo_vdev_active;
473 	uint32_t vdev_tx_power;
474 };
475 
476 /**
477  * struct vdev_mc_cp_stats - vdev specific stats
478  * @cca: cca stats
479  * @tx_rate_flags: tx rate flags (enum tx_rate_info)
480  * @chain_rssi: chain rssi
481  * @vdev_summary_stats: vdev's summary stats
482  * @pmf_bcn_stats: pmf beacon protect stats
483  * @vdev_extd_stats: vdev summary extended stats
484  */
485 struct vdev_mc_cp_stats {
486 	struct cca_stats cca;
487 	uint32_t tx_rate_flags;
488 	int8_t chain_rssi[MAX_NUM_CHAINS];
489 	struct summary_stats vdev_summary_stats;
490 	struct pmf_bcn_protect_stats pmf_bcn_stats;
491 	struct vdev_summary_extd_stats vdev_extd_stats;
492 };
493 
494 /**
495  * struct peer_extd_stats - Peer extension statistics
496  * @peer_macaddr: peer MAC address
497  * @rx_duration: lower 32 bits of rx duration in microseconds
498  * @peer_tx_bytes: Total TX bytes (including dot11 header) sent to peer
499  * @peer_rx_bytes: Total RX bytes (including dot11 header) received from peer
500  * @last_tx_rate_code: last TX ratecode
501  * @last_tx_power: TX power used by peer - units are 0.5 dBm
502  * @rx_mc_bc_cnt: Total number of received multicast & broadcast data frames
503  * corresponding to this peer, 1 in the MSB of rx_mc_bc_cnt represents a
504  * valid data
505  */
506 struct peer_extd_stats {
507 	uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
508 	uint32_t rx_duration;
509 	uint32_t peer_tx_bytes;
510 	uint32_t peer_rx_bytes;
511 	uint32_t last_tx_rate_code;
512 	int32_t last_tx_power;
513 	uint32_t rx_mc_bc_cnt;
514 };
515 
516 /**
517  * struct peer_mc_cp_stats - peer specific stats
518  * @tx_rate: tx rate
519  * @rx_rate: rx rate
520  * @peer_rssi: rssi
521  * @peer_macaddr: mac address
522  * @extd_stats: Pointer to peer extended stats
523  * @adv_stats: Pointer to peer adv (extd2) stats
524  * @twt_param: Pointer to peer twt session parameters
525  */
526 struct peer_mc_cp_stats {
527 	uint32_t tx_rate;
528 	uint32_t rx_rate;
529 	int8_t peer_rssi;
530 	uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
531 	struct peer_extd_stats *extd_stats;
532 	struct peer_adv_mc_cp_stats *adv_stats;
533 #ifdef WLAN_SUPPORT_TWT
534 	struct wmi_host_twt_session_stats_info twt_param[TWT_PEER_MAX_SESSIONS];
535 #endif
536 };
537 
538 /**
539  * struct peer_adv_mc_cp_stats - peer specific adv stats
540  * @peer_macaddr: mac address
541  * @fcs_count: fcs count
542  * @rx_bytes: rx bytes
543  * @rx_count: rx count
544  */
545 struct peer_adv_mc_cp_stats {
546 	uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
547 	uint32_t fcs_count;
548 	uint32_t rx_count;
549 	uint64_t rx_bytes;
550 };
551 
552 #ifdef WLAN_FEATURE_MIB_STATS
553 /**
554  * struct dot11_counters - mib group containing attributes that are MAC counters
555  * @tx_frags: successfully transmitted fragments
556  * @group_tx_frames: transmitted group addressed frames
557  * @failed_cnt: MSDUs not transmitted successfully
558  * @rx_frags: fragments successfully received
559  * @group_rx_frames: group addressed frames received
560  * @fcs_error_cnt: FCS errors detected
561  * @tx_frames: frames successfully transmitted
562  */
563 struct dot11_counters {
564 	uint32_t tx_frags;
565 	uint32_t group_tx_frames;
566 	uint32_t failed_cnt;
567 	uint32_t rx_frags;
568 	uint32_t group_rx_frames;
569 	uint32_t fcs_error_cnt;
570 	uint32_t tx_frames;
571 };
572 
573 /**
574  * struct dot11_mac_statistics - mib stats information on the operation of MAC
575  * @retry_cnt: retries done by mac for successful transmission
576  * @multi_retry_cnt: multiple retries done before successful transmission
577  * @frame_dup_cnt: duplicate no of frames
578  * @rts_success_cnt: number of CTS received (in response to RTS)
579  * @rts_fail_cnt: number of CTS not received (in response to RTS)
580  * @tx_ack_fail_cnt: number of ACK not received
581  */
582 struct dot11_mac_statistics {
583 	uint32_t retry_cnt;
584 	uint32_t multi_retry_cnt;
585 	uint32_t frame_dup_cnt;
586 	uint32_t rts_success_cnt;
587 	uint32_t rts_fail_cnt;
588 	uint32_t tx_ack_fail_cnt;
589 };
590 
591 /**
592  * struct dot11_qos_counters - qos mac counters
593  * @qos_tx_frag_cnt: transmitted QoS fragments
594  * @qos_failed_cnt: failed Qos fragments
595  * @qos_retry_cnt: Qos frames transmitted after retransmissions
596  * @qos_multi_retry_cnt: Qos frames transmitted after more than
597  *                       one retransmissions
598  * @qos_frame_dup_cnt: duplicate frames
599  * @qos_rts_success_cnt: number of CTS received (in response to RTS)
600  * @qos_rts_fail_cnt: number of CTS not received (in response to RTS)
601  * @tx_qos_ack_fail_cnt_up: number of ACK not received
602  *                          (in response to Qos frame)
603  * @qos_rx_frag_cnt: number of received MPDU of type Data
604  * @qos_tx_frame_cnt: number of transmitted MPDU of type Data
605  * @qos_discarded_frame_cnt: total Discarded MSDUs
606  * @qos_mpdu_rx_cnt: total received MPDU
607  * @qos_retries_rx_cnt: received MPDU with retry bit equal to 1
608  */
609 struct dot11_qos_counters {
610 	uint32_t qos_tx_frag_cnt;
611 	uint32_t qos_failed_cnt;
612 	uint32_t qos_retry_cnt;
613 	uint32_t qos_multi_retry_cnt;
614 	uint32_t qos_frame_dup_cnt;
615 	uint32_t qos_rts_success_cnt;
616 	uint32_t qos_rts_fail_cnt;
617 	uint32_t tx_qos_ack_fail_cnt_up;
618 	uint32_t qos_rx_frag_cnt;
619 	uint32_t qos_tx_frame_cnt;
620 	uint32_t qos_discarded_frame_cnt;
621 	uint32_t qos_mpdu_rx_cnt;
622 	uint32_t qos_retries_rx_cnt;
623 };
624 
625 /**
626  * struct dot11_rsna_stats - mib rsn stats
627  * @rm_ccmp_replays: received robust management CCMP MPDUs discarded
628  *                   by the replay mechanism
629  * @tkip_icv_err: TKIP ICV errors encountered
630  * @tkip_replays: TKIP replay errors detected
631  * @ccmp_decrypt_err: MPDUs discarded by the CCMP decryption algorithm
632  * @ccmp_replays: received CCMP MPDUs discarded by the replay mechanism
633  * @cmac_icv_err: MPDUs discarded by the CMAC integrity check algorithm
634  * @cmac_replays: MPDUs discarded by the CMAC replay errors
635  */
636 struct dot11_rsna_stats {
637 	uint32_t rm_ccmp_replays;
638 	uint32_t tkip_icv_err;
639 	uint32_t tkip_replays;
640 	uint32_t ccmp_decrypt_err;
641 	uint32_t ccmp_replays;
642 	uint32_t cmac_icv_err;
643 	uint32_t cmac_replays;
644 };
645 
646 /**
647  * struct dot11_counters_group3 - dot11 group3 stats
648  * @tx_ampdu_cnt: transmitted AMPDUs
649  * @tx_mpdus_in_ampdu_cnt: number of MPDUs in the A-MPDU in transmitted AMPDUs
650  * @tx_octets_in_ampdu_cnt: octets in the transmitted A-MPDUs
651  * @ampdu_rx_cnt: received A-MPDU
652  * @mpdu_in_rx_ampdu_cnt: MPDUs received in the A-MPDU
653  * @rx_octets_in_ampdu_cnt: octets in the received A-MPDU
654  * @rx_ampdu_deli_crc_err_cnt: number of MPDUs delimiter with CRC error
655  */
656 struct dot11_counters_group3 {
657 	uint32_t tx_ampdu_cnt;
658 	uint32_t tx_mpdus_in_ampdu_cnt;
659 	uint64_t tx_octets_in_ampdu_cnt;
660 	uint32_t ampdu_rx_cnt;
661 	uint32_t mpdu_in_rx_ampdu_cnt;
662 	uint64_t rx_octets_in_ampdu_cnt;
663 	uint32_t rx_ampdu_deli_crc_err_cnt;
664 };
665 
666 /**
667  * struct mib_stats_metrics - mib stats counters
668  * @mib_counters: dot11Counters group
669  * @mib_mac_statistics: dot11MACStatistics group
670  * @mib_qos_counters: dot11QoSCounters group
671  * @mib_rsna_stats: dot11RSNAStats group
672  * @mib_counters_group3: dot11CountersGroup3 group
673  */
674 struct mib_stats_metrics {
675 	struct dot11_counters mib_counters;
676 	struct dot11_mac_statistics mib_mac_statistics;
677 	struct dot11_qos_counters mib_qos_counters;
678 	struct dot11_rsna_stats mib_rsna_stats;
679 	struct dot11_counters_group3 mib_counters_group3;
680 };
681 #endif
682 
683 /**
684  * struct congestion_stats_event: congestion stats event param
685  * @vdev_id: vdev_id of the event
686  * @congestion: the congestion percentage
687  */
688 struct congestion_stats_event {
689 	uint8_t vdev_id;
690 	uint32_t congestion;
691 };
692 
693 /**
694  * struct summary_stats_event - summary_stats event param
695  * @vdev_id: vdev_id of the event
696  * @stats: summary stats
697  */
698 struct summary_stats_event {
699 	uint8_t vdev_id;
700 	struct summary_stats stats;
701 };
702 
703 /**
704  * struct chain_rssi_event - chain_rssi event param
705  * @vdev_id: vdev_id of the event
706  * @chain_rssi: chain_rssi
707  */
708 struct chain_rssi_event {
709 	uint8_t vdev_id;
710 	int8_t chain_rssi[MAX_NUM_CHAINS];
711 };
712 
713 /**
714  * struct peer_stats_info_ext_event - peer extended stats info
715  * @peer_macaddr: MAC address
716  * @tx_packets: packets transmitted to this station
717  * @tx_bytes: bytes transmitted to this station
718  * @rx_packets: packets received from this station
719  * @rx_bytes: bytes received from this station
720  * @tx_retries: cumulative retry counts
721  * @tx_failed: the number of failed frames
722  * @tx_succeed: the number of succeed frames
723  * @rssi: the signal strength
724  * @tx_rate: last used tx bitrate (kbps)
725  * @tx_rate_code: last tx rate code (last_tx_rate_code of wmi_peer_stats_info)
726  * @rx_rate: last used rx bitrate (kbps)
727  * @rx_rate_code: last rx rate code (last_rx_rate_code of wmi_peer_stats_info)
728  * @peer_rssi_per_chain: the average value of RSSI (dbm) per chain
729  * @num_tx_rate_counts: Num tx rate count for current peer
730  * @num_rx_rate_counts: Num rx rate count for current peer
731  * @tx_pkt_per_mcs: Number of tx packets for each MCS
732  * @rx_pkt_per_mcs: Number of rx packets for each MCS
733  */
734 struct peer_stats_info_ext_event {
735 	struct qdf_mac_addr peer_macaddr;
736 	uint32_t tx_packets;
737 	uint64_t tx_bytes;
738 	uint32_t rx_packets;
739 	uint64_t rx_bytes;
740 	uint32_t tx_retries;
741 	uint32_t tx_failed;
742 	uint32_t tx_succeed;
743 	int32_t rssi;
744 	uint32_t tx_rate;
745 	uint32_t tx_rate_code;
746 	uint32_t rx_rate;
747 	uint32_t rx_rate_code;
748 	int32_t peer_rssi_per_chain[WMI_MAX_CHAINS];
749 	uint32_t num_tx_rate_counts;
750 	uint32_t num_rx_rate_counts;
751 	uint32_t *tx_pkt_per_mcs;
752 	uint32_t *rx_pkt_per_mcs;
753 };
754 
755 /**
756  * struct stats_event - parameters populated by stats event
757  * @num_pdev_stats: num pdev stats
758  * @pdev_stats: if populated array indicating pdev stats (index = pdev_id)
759  * @num_pdev_extd_stats: num pdev extended stats
760  * @pdev_extd_stats: if populated array indicating pdev extended stats
761  *                   (index = pdev_id)
762  * @num_peer_stats: num peer stats
763  * @peer_stats: if populated array indicating peer stats
764  * @peer_adv_stats: if populated, indicates peer adv (extd2) stats
765  * @num_peer_adv_stats: number of peer adv (extd2) stats
766  * @num_peer_extd_stats: Num peer extended stats
767  * @peer_extended_stats: Peer extended stats
768  * @cca_stats: if populated indicates congestion stats
769  * @num_summary_stats: number of summary stats
770  * @vdev_summary_stats: if populated indicates array of summary stats per vdev
771  * @num_mib_stats: number of mib stats
772  * @mib_stats: if populated indicates array of mib stats per vdev
773  * @num_chain_rssi_stats: number of chain rssi stats
774  * @vdev_chain_rssi: if populated indicates array of chain rssi per vdev
775  * @tx_rate: tx rate (kbps)
776  * @rx_rate: rx rate (kbps)
777  * @tx_rate_flags: tx rate flags, (enum tx_rate_info)
778  * @last_event: The LSB indicates if the event is the last event or not and the
779  *              MSB indicates if this feature is supported by FW or not.
780  * @mac_seq_num: sequence number of event when fw update to host
781  * @num_peer_stats_info_ext: number of peer extended stats info
782  * @peer_stats_info_ext: peer extended stats info
783  * @bcn_protect_stats: pmf bcn protect stats
784  * @num_vdev_extd_stats: number of vdev extended stats
785  * @vdev_extd_stats: if populated indicates array of ext summary stats per vdev
786  */
787 struct stats_event {
788 	uint32_t num_pdev_stats;
789 	struct pdev_mc_cp_stats *pdev_stats;
790 	uint32_t num_pdev_extd_stats;
791 	struct pdev_mc_cp_extd_stats *pdev_extd_stats;
792 	uint32_t num_peer_stats;
793 	struct peer_mc_cp_stats *peer_stats;
794 	uint32_t num_peer_adv_stats;
795 	struct peer_adv_mc_cp_stats *peer_adv_stats;
796 	uint32_t num_peer_extd_stats;
797 	struct peer_extd_stats *peer_extended_stats;
798 	struct congestion_stats_event *cca_stats;
799 	uint32_t num_summary_stats;
800 	struct summary_stats_event *vdev_summary_stats;
801 #ifdef WLAN_FEATURE_MIB_STATS
802 	uint32_t num_mib_stats;
803 	struct mib_stats_metrics *mib_stats;
804 #endif
805 	uint32_t num_chain_rssi_stats;
806 	struct chain_rssi_event *vdev_chain_rssi;
807 	uint32_t tx_rate;
808 	uint32_t rx_rate;
809 	enum tx_rate_info tx_rate_flags;
810 	uint32_t last_event;
811 	uint8_t mac_seq_num;
812 	uint32_t num_peer_stats_info_ext;
813 	struct peer_stats_info_ext_event *peer_stats_info_ext;
814 	struct pmf_bcn_protect_stats bcn_protect_stats;
815 	uint32_t num_vdev_extd_stats;
816 	struct vdev_summary_extd_stats *vdev_extd_stats;
817 };
818 
819 /**
820  * struct peer_stats_request_params - peer stats request parameter
821  * @request_type: request type, one peer or all peers of the vdev
822  * @vdev_id: vdev id
823  * @peer_mac_addr: peer mac address, omitted if request type is all peers
824  * @reset_after_request: whether reset stats after request
825  */
826 struct peer_stats_request_params {
827 	uint32_t request_type;
828 	uint32_t vdev_id;
829 	uint8_t peer_mac_addr[QDF_MAC_ADDR_SIZE];
830 	uint32_t reset_after_request;
831 };
832 
833 /**
834  * struct wmi_host_peer_stats_info - WMI peer stats info
835  * @peer_macaddr: peer mac address
836  * @tx_bytes: tx_bytes
837  * @tx_packets: tx packets
838  * @rx_bytes: rx_bytes
839  * @rx_packets: rx packets
840  * @tx_retries: tx retries of MPDU
841  * @tx_failed: tx failed MPDU
842  * @last_tx_rate_code: rate code of the last tx
843  * @last_rx_rate_code: rate code of the last rx
844  * @last_tx_bitrate_kbps: bitrate in bps of the last tx
845  * @last_rx_bitrate_kbps: bitrate in bps of the last rx
846  * @peer_rssi: peer rssi
847  * @tx_succeed: tx succeed MPDU
848  * @peer_rssi_per_chain: peer rssi per chain
849  * @num_tx_rate_counts: Num tx rate count for current peer
850  * @num_rx_rate_counts: Num rx rate count for current peer
851  * @tx_pkt_per_mcs: Number of tx rate counts for each MCS
852  * @rx_pkt_per_mcs: Number of rx rate counts for each MCS
853  */
854 typedef struct {
855 	struct qdf_mac_addr peer_macaddr;
856 	uint64_t tx_bytes;
857 	uint32_t tx_packets;
858 	uint64_t rx_bytes;
859 	uint32_t rx_packets;
860 	uint32_t tx_retries;
861 	uint32_t tx_failed;
862 	uint32_t last_tx_rate_code;
863 	uint32_t last_rx_rate_code;
864 	uint32_t last_tx_bitrate_kbps;
865 	uint32_t last_rx_bitrate_kbps;
866 	int32_t peer_rssi;
867 	uint32_t tx_succeed;
868 	int32_t peer_rssi_per_chain[WMI_MAX_CHAINS];
869 	uint32_t num_tx_rate_counts;
870 	uint32_t num_rx_rate_counts;
871 	uint32_t *tx_pkt_per_mcs;
872 	uint32_t *rx_pkt_per_mcs;
873 } wmi_host_peer_stats_info;
874 
875 #endif /* __WLAN_CP_STATS_MC_DEFS_H__ */
876