xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_cp_stats_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name #include "osdep.h"
19*5113495bSYour Name #include "wmi.h"
20*5113495bSYour Name #include "wmi_unified_priv.h"
21*5113495bSYour Name #include "wmi_unified_param.h"
22*5113495bSYour Name #include "target_if_cp_stats.h"
23*5113495bSYour Name #include <wlan_cp_stats_public_structs.h>
24*5113495bSYour Name 
25*5113495bSYour Name #if defined(WLAN_SUPPORT_INFRA_CTRL_PATH_STATS) || \
26*5113495bSYour Name 	defined(WLAN_CONFIG_TELEMETRY_AGENT)
27*5113495bSYour Name /**
28*5113495bSYour Name  * get_infra_cp_stats_id() - convert from to wmi_ctrl_path_stats_id
29*5113495bSYour Name  * @type: type from enum infra_cp_stats_id
30*5113495bSYour Name  *
31*5113495bSYour Name  * Return: wmi_ctrl_path_stats_id code for success or -EINVAL
32*5113495bSYour Name  * for failure
33*5113495bSYour Name  */
get_infra_cp_stats_id(enum infra_cp_stats_id type)34*5113495bSYour Name static uint32_t get_infra_cp_stats_id(enum infra_cp_stats_id type)
35*5113495bSYour Name {
36*5113495bSYour Name 	switch (type) {
37*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_PDEV_TX_STAT:
38*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_PDEV_TX_STAT;
39*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_VDEV_EXTD_STAT:
40*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_VDEV_EXTD_STAT;
41*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_MEM_STAT:
42*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_MEM_STAT;
43*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_TWT_STAT:
44*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_TWT_STAT;
45*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_BMISS_STAT:
46*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_BMISS_STAT;
47*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_PMLO_STAT:
48*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_PMLO_STAT;
49*5113495bSYour Name 	case TYPE_REQ_CTRL_PATH_RRM_STA_STAT:
50*5113495bSYour Name 		return WMI_REQUEST_CTRL_STA_RRM_STAT;
51*5113495bSYour Name 	default:
52*5113495bSYour Name 		return -EINVAL;
53*5113495bSYour Name 	}
54*5113495bSYour Name }
55*5113495bSYour Name 
56*5113495bSYour Name /**
57*5113495bSYour Name  * get_infra_cp_stats_action() - convert action codes from
58*5113495bSYour Name  * enum infra_cp_stats_action to wmi_ctrl_path_stats_action
59*5113495bSYour Name  * @action: action code from enum infra_cp_stats_action
60*5113495bSYour Name  *
61*5113495bSYour Name  * Return: wmi_ctrl_path_stats_action code for success or -EINVAL
62*5113495bSYour Name  * for failure
63*5113495bSYour Name  */
get_infra_cp_stats_action(enum infra_cp_stats_action action)64*5113495bSYour Name static uint32_t get_infra_cp_stats_action(enum infra_cp_stats_action action)
65*5113495bSYour Name {
66*5113495bSYour Name 	switch (action) {
67*5113495bSYour Name 	case ACTION_REQ_CTRL_PATH_STAT_GET:
68*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_STAT_GET;
69*5113495bSYour Name 	case ACTION_REQ_CTRL_PATH_STAT_RESET:
70*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_STAT_RESET;
71*5113495bSYour Name 	case ACTION_REQ_CTRL_PATH_STAT_START:
72*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_STAT_START;
73*5113495bSYour Name 	case ACTION_REQ_CTRL_PATH_STAT_STOP:
74*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_STAT_STOP;
75*5113495bSYour Name 	case ACTION_REQ_CTRL_PATH_STAT_PERIODIC_PUBLISH:
76*5113495bSYour Name 		return WMI_REQUEST_CTRL_PATH_STAT_PERIODIC_PUBLISH;
77*5113495bSYour Name 	default:
78*5113495bSYour Name 		return -EINVAL;
79*5113495bSYour Name 	}
80*5113495bSYour Name }
81*5113495bSYour Name 
82*5113495bSYour Name #ifdef WLAN_SUPPORT_TWT
83*5113495bSYour Name static uint32_t
get_stats_req_twt_dialog_id(struct infra_cp_stats_cmd_info * req)84*5113495bSYour Name get_stats_req_twt_dialog_id(struct infra_cp_stats_cmd_info *req)
85*5113495bSYour Name {
86*5113495bSYour Name 	return req->dialog_id;
87*5113495bSYour Name }
88*5113495bSYour Name 
89*5113495bSYour Name static enum WMI_HOST_GET_STATS_TWT_STATUS
wmi_get_converted_twt_get_stats_status(WMI_GET_STATS_TWT_STATUS_T tgt_status)90*5113495bSYour Name wmi_get_converted_twt_get_stats_status(WMI_GET_STATS_TWT_STATUS_T tgt_status)
91*5113495bSYour Name {
92*5113495bSYour Name 	switch (tgt_status) {
93*5113495bSYour Name 	case WMI_GET_STATS_TWT_STATUS_OK:
94*5113495bSYour Name 		return WMI_HOST_GET_STATS_TWT_STATUS_OK;
95*5113495bSYour Name 	case WMI_GET_STATS_TWT_STATUS_DIALOG_ID_NOT_EXIST:
96*5113495bSYour Name 		return WMI_HOST_GET_STATS_TWT_STATUS_DIALOG_ID_NOT_EXIST;
97*5113495bSYour Name 	case WMI_GET_STATS_TWT_STATUS_INVALID_PARAM:
98*5113495bSYour Name 		return WMI_HOST_GET_STATS_TWT_STATUS_INVALID_PARAM;
99*5113495bSYour Name 	default:
100*5113495bSYour Name 		return WMI_HOST_GET_STATS_TWT_STATUS_UNKNOWN_ERROR;
101*5113495bSYour Name 	}
102*5113495bSYour Name }
103*5113495bSYour Name 
104*5113495bSYour Name static inline
wmi_extract_ctrl_path_twt_stats_tlv(void * tag_buf,struct twt_infra_cp_stats_event * param)105*5113495bSYour Name void wmi_extract_ctrl_path_twt_stats_tlv(void *tag_buf,
106*5113495bSYour Name 					 struct twt_infra_cp_stats_event *param)
107*5113495bSYour Name {
108*5113495bSYour Name 	wmi_ctrl_path_twt_stats_struct *wmi_stats_buf =
109*5113495bSYour Name 			(wmi_ctrl_path_twt_stats_struct *)tag_buf;
110*5113495bSYour Name 
111*5113495bSYour Name 	param->dialog_id = wmi_stats_buf->dialog_id;
112*5113495bSYour Name 	param->status = wmi_get_converted_twt_get_stats_status(wmi_stats_buf->status);
113*5113495bSYour Name 	param->num_sp_cycles = wmi_stats_buf->num_sp_cycles;
114*5113495bSYour Name 	param->avg_sp_dur_us = wmi_stats_buf->avg_sp_dur_us;
115*5113495bSYour Name 	param->min_sp_dur_us = wmi_stats_buf->min_sp_dur_us;
116*5113495bSYour Name 	param->max_sp_dur_us = wmi_stats_buf->max_sp_dur_us;
117*5113495bSYour Name 	param->tx_mpdu_per_sp = wmi_stats_buf->tx_mpdu_per_sp;
118*5113495bSYour Name 	param->rx_mpdu_per_sp = wmi_stats_buf->rx_mpdu_per_sp;
119*5113495bSYour Name 	param->tx_bytes_per_sp = wmi_stats_buf->tx_bytes_per_sp;
120*5113495bSYour Name 	param->rx_bytes_per_sp = wmi_stats_buf->rx_bytes_per_sp;
121*5113495bSYour Name 
122*5113495bSYour Name 	wmi_debug("dialog_id = %u status = %u", wmi_stats_buf->dialog_id,
123*5113495bSYour Name 		  wmi_stats_buf->status);
124*5113495bSYour Name 	wmi_debug("num_sp_cycles = %u avg_sp_dur_us = 0x%x, \
125*5113495bSYour Name 		  min_sp_dur_us = 0x%x, max_sp_dur_us = 0x%x",
126*5113495bSYour Name 		  wmi_stats_buf->num_sp_cycles, wmi_stats_buf->avg_sp_dur_us,
127*5113495bSYour Name 		  wmi_stats_buf->min_sp_dur_us, wmi_stats_buf->max_sp_dur_us);
128*5113495bSYour Name 	wmi_debug("tx_mpdu_per_sp 0x%x, rx_mpdu_per_sp = 0x%x, \
129*5113495bSYour Name 		  tx_bytes_per_sp = 0x%x, rx_bytes_per_sp = 0x%x",
130*5113495bSYour Name 		  wmi_stats_buf->tx_mpdu_per_sp, wmi_stats_buf->rx_mpdu_per_sp,
131*5113495bSYour Name 		  wmi_stats_buf->tx_bytes_per_sp,
132*5113495bSYour Name 		  wmi_stats_buf->rx_bytes_per_sp);
133*5113495bSYour Name }
134*5113495bSYour Name 
wmi_twt_extract_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)135*5113495bSYour Name static void wmi_twt_extract_stats_struct(void *tag_buf,
136*5113495bSYour Name 					 struct infra_cp_stats_event *params)
137*5113495bSYour Name {
138*5113495bSYour Name 	struct twt_infra_cp_stats_event *twt_params;
139*5113495bSYour Name 
140*5113495bSYour Name 	twt_params = params->twt_infra_cp_stats +
141*5113495bSYour Name 		     params->num_twt_infra_cp_stats;
142*5113495bSYour Name 
143*5113495bSYour Name 	wmi_debug("TWT stats struct found - num_twt_cp_stats %d",
144*5113495bSYour Name 		  params->num_twt_infra_cp_stats);
145*5113495bSYour Name 
146*5113495bSYour Name 	params->num_twt_infra_cp_stats++;
147*5113495bSYour Name 	wmi_extract_ctrl_path_twt_stats_tlv(tag_buf, twt_params);
148*5113495bSYour Name }
149*5113495bSYour Name #else
150*5113495bSYour Name static inline
get_stats_req_twt_dialog_id(struct infra_cp_stats_cmd_info * req)151*5113495bSYour Name uint32_t get_stats_req_twt_dialog_id(struct infra_cp_stats_cmd_info *req)
152*5113495bSYour Name {
153*5113495bSYour Name 	return 0;
154*5113495bSYour Name }
155*5113495bSYour Name 
wmi_twt_extract_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)156*5113495bSYour Name static void wmi_twt_extract_stats_struct(void *tag_buf,
157*5113495bSYour Name 					 struct infra_cp_stats_event *params)
158*5113495bSYour Name {
159*5113495bSYour Name }
160*5113495bSYour Name #endif /* WLAN_SUPPORT_TWT */
161*5113495bSYour Name 
162*5113495bSYour Name #ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
163*5113495bSYour Name static void
wmi_extract_ctrl_path_rrm_sta_stats_tlv(void * tag_buf,struct cp_sta_stats * param)164*5113495bSYour Name wmi_extract_ctrl_path_rrm_sta_stats_tlv(void *tag_buf,
165*5113495bSYour Name 					struct cp_sta_stats *param)
166*5113495bSYour Name {
167*5113495bSYour Name 	wmi_ctrl_path_sta_rrm_stats_struct *wmi_stats_buf =
168*5113495bSYour Name 			(wmi_ctrl_path_sta_rrm_stats_struct *)tag_buf;
169*5113495bSYour Name 	param->group.counter_stats.group_transmitted_frame_count =
170*5113495bSYour Name 		wmi_stats_buf->dot11GroupTransmittedFrameCount;
171*5113495bSYour Name 	param->group.counter_stats.group_received_frame_count =
172*5113495bSYour Name 		wmi_stats_buf->dot11GroupReceivedFrameCount;
173*5113495bSYour Name 	param->group.counter_stats.transmitted_frame_count =
174*5113495bSYour Name 		wmi_stats_buf->dot11TransmittedFrameCount;
175*5113495bSYour Name 	param->group.mac_stats.ack_failure_count =
176*5113495bSYour Name 		wmi_stats_buf->dot11AckFailureCount;
177*5113495bSYour Name 	param->group.counter_stats.failed_count =
178*5113495bSYour Name 		wmi_stats_buf->dot11FailedCount;
179*5113495bSYour Name 	param->group.counter_stats.fcs_error_count =
180*5113495bSYour Name 		wmi_stats_buf->dot11FCSErrorCount;
181*5113495bSYour Name 	param->group.mac_stats.rts_success_count =
182*5113495bSYour Name 		wmi_stats_buf->dot11RTSSuccessCount;
183*5113495bSYour Name 	param->group.mac_stats.rts_failure_count =
184*5113495bSYour Name 		wmi_stats_buf->dot11RTSFailureCount;
185*5113495bSYour Name }
186*5113495bSYour Name 
187*5113495bSYour Name static void
wmi_rrm_extract_sta_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)188*5113495bSYour Name wmi_rrm_extract_sta_stats_struct(void *tag_buf,
189*5113495bSYour Name 				 struct infra_cp_stats_event *params)
190*5113495bSYour Name {
191*5113495bSYour Name 	struct cp_sta_stats *rrm_sta_stats;
192*5113495bSYour Name 
193*5113495bSYour Name 	rrm_sta_stats = params->sta_stats;
194*5113495bSYour Name 	wmi_extract_ctrl_path_rrm_sta_stats_tlv(tag_buf, rrm_sta_stats);
195*5113495bSYour Name }
196*5113495bSYour Name #else
197*5113495bSYour Name static inline void
wmi_rrm_extract_sta_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)198*5113495bSYour Name wmi_rrm_extract_sta_stats_struct(void *tag_buf,
199*5113495bSYour Name 				 struct infra_cp_stats_event *params)
200*5113495bSYour Name {}
201*5113495bSYour Name #endif
202*5113495bSYour Name 
203*5113495bSYour Name #ifdef CONFIG_WLAN_BMISS
204*5113495bSYour Name static void
wmi_extract_ctrl_path_bmiss_stats_tlv(void * tag_buf,struct bmiss_infra_cp_stats_event * param)205*5113495bSYour Name wmi_extract_ctrl_path_bmiss_stats_tlv(void *tag_buf,
206*5113495bSYour Name 				      struct bmiss_infra_cp_stats_event *param)
207*5113495bSYour Name {
208*5113495bSYour Name 	int idx = 0;
209*5113495bSYour Name 
210*5113495bSYour Name 	wmi_ctrl_path_bmiss_stats_struct *wmi_stats_buf =
211*5113495bSYour Name 			(wmi_ctrl_path_bmiss_stats_struct *)tag_buf;
212*5113495bSYour Name 	param->num_pre_bmiss = wmi_stats_buf->num_pre_bmiss;
213*5113495bSYour Name 	for (idx = 0; idx < BMISS_STATS_RSSI_SAMPLES_MAX; idx++) {
214*5113495bSYour Name 		param->rssi_samples[idx].rssi =
215*5113495bSYour Name 				wmi_stats_buf->rssi_samples[idx].rssi;
216*5113495bSYour Name 		param->rssi_samples[idx].sample_time =
217*5113495bSYour Name 				wmi_stats_buf->rssi_samples[idx].sample_time;
218*5113495bSYour Name 	}
219*5113495bSYour Name 	param->rssi_sample_curr_index = wmi_stats_buf->rssi_sample_curr_index;
220*5113495bSYour Name 	param->num_first_bmiss = wmi_stats_buf->num_first_bmiss;
221*5113495bSYour Name 	param->num_final_bmiss = wmi_stats_buf->num_final_bmiss;
222*5113495bSYour Name 	param->num_null_sent_in_first_bmiss =
223*5113495bSYour Name 	wmi_stats_buf->num_null_sent_in_first_bmiss;
224*5113495bSYour Name 	param->num_null_failed_in_first_bmiss =
225*5113495bSYour Name 	wmi_stats_buf->num_null_failed_in_first_bmiss;
226*5113495bSYour Name 	param->num_null_failed_in_final_bmiss =
227*5113495bSYour Name 	wmi_stats_buf->num_null_failed_in_final_bmiss;
228*5113495bSYour Name 	param->cons_bmiss_stats.num_of_bmiss_sequences =
229*5113495bSYour Name 	wmi_stats_buf->cons_bmiss_stats.num_of_bmiss_sequences;
230*5113495bSYour Name 	param->cons_bmiss_stats.num_bitmask_wraparound =
231*5113495bSYour Name 	wmi_stats_buf->cons_bmiss_stats.num_bitmask_wraparound;
232*5113495bSYour Name 	param->cons_bmiss_stats.num_bcn_hist_lost =
233*5113495bSYour Name 	wmi_stats_buf->cons_bmiss_stats.num_bcn_hist_lost;
234*5113495bSYour Name 	wmi_debug("num_pre_bmiss = %u", wmi_stats_buf->num_pre_bmiss);
235*5113495bSYour Name 	wmi_debug("num_first_bmiss = %u num_final_bmiss = %u, num_null_sent_in_first_bmiss = %u, num_null_failed_in_first_bmiss = %u",
236*5113495bSYour Name 		  wmi_stats_buf->num_first_bmiss,
237*5113495bSYour Name 		  wmi_stats_buf->num_final_bmiss,
238*5113495bSYour Name 		  wmi_stats_buf->num_null_sent_in_first_bmiss,
239*5113495bSYour Name 		  wmi_stats_buf->num_null_failed_in_first_bmiss);
240*5113495bSYour Name 	wmi_debug("num_null_sent_in_final_bmiss %u null_fail_cnt_final_bmiss = %u rssi_sample_curr_index = %u",
241*5113495bSYour Name 		  wmi_stats_buf->num_null_sent_in_final_bmiss,
242*5113495bSYour Name 		  wmi_stats_buf->num_null_failed_in_final_bmiss,
243*5113495bSYour Name 		  wmi_stats_buf->rssi_sample_curr_index);
244*5113495bSYour Name 	for (idx = 0; idx < BMISS_STATS_RSSI_SAMPLES_MAX; idx++) {
245*5113495bSYour Name 		wmi_debug("rssi_sample-%u: rssi=%u", idx,
246*5113495bSYour Name 			  wmi_stats_buf->rssi_samples[idx].rssi);
247*5113495bSYour Name 		wmi_debug("rssi_sample-%u: sampletime=%u", idx,
248*5113495bSYour Name 			  wmi_stats_buf->rssi_samples[idx].sample_time);
249*5113495bSYour Name 	}
250*5113495bSYour Name 	wmi_debug("num_of_bmiss_sequences %u num_bitmask_wraparound = %u num_bcn_hist_lost = %u",
251*5113495bSYour Name 		  wmi_stats_buf->cons_bmiss_stats.num_of_bmiss_sequences,
252*5113495bSYour Name 		  wmi_stats_buf->cons_bmiss_stats.num_bitmask_wraparound,
253*5113495bSYour Name 		  wmi_stats_buf->cons_bmiss_stats.num_bcn_hist_lost);
254*5113495bSYour Name }
255*5113495bSYour Name 
wmi_bmiss_extract_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)256*5113495bSYour Name static void wmi_bmiss_extract_stats_struct(void *tag_buf,
257*5113495bSYour Name 					   struct infra_cp_stats_event *params)
258*5113495bSYour Name {
259*5113495bSYour Name 	struct bmiss_infra_cp_stats_event *bmiss_params;
260*5113495bSYour Name 
261*5113495bSYour Name 	bmiss_params = params->bmiss_infra_cp_stats;
262*5113495bSYour Name 	wmi_debug("BMISS stats struct found");
263*5113495bSYour Name 	wmi_extract_ctrl_path_bmiss_stats_tlv(tag_buf, bmiss_params);
264*5113495bSYour Name }
265*5113495bSYour Name 
266*5113495bSYour Name #else /* CONFIG_WLAN_BMISS */
267*5113495bSYour Name static inline
wmi_bmiss_extract_stats_struct(void * tag_buf,struct infra_cp_stats_event * params)268*5113495bSYour Name void wmi_bmiss_extract_stats_struct(void *tag_buf,
269*5113495bSYour Name 				    struct infra_cp_stats_event *params)
270*5113495bSYour Name 
271*5113495bSYour Name {
272*5113495bSYour Name }
273*5113495bSYour Name 
274*5113495bSYour Name #endif/* CONFIG_WLAN_BMISS */
275*5113495bSYour Name 
276*5113495bSYour Name #ifdef WLAN_CONFIG_TELEMETRY_AGENT
277*5113495bSYour Name static void
wmi_extract_ctrl_path_pmlo_stats_tlv(wmi_unified_t wmi_handle,void * tag_buf,struct ctrl_path_pmlo_telemetry_stats_struct * param)278*5113495bSYour Name wmi_extract_ctrl_path_pmlo_stats_tlv(wmi_unified_t wmi_handle, void *tag_buf,
279*5113495bSYour Name 				     struct ctrl_path_pmlo_telemetry_stats_struct *param)
280*5113495bSYour Name {
281*5113495bSYour Name 	int idx = 0;
282*5113495bSYour Name 	wmi_ctrl_path_pmlo_stats_struct *wmi_stats_buf = tag_buf;
283*5113495bSYour Name 
284*5113495bSYour Name 	param->pdev_id =
285*5113495bSYour Name 	     wmi_handle->ops->convert_target_pdev_id_to_host(wmi_handle,
286*5113495bSYour Name 							wmi_stats_buf->pdev_id);
287*5113495bSYour Name 	param->dl_inbss_airtime_ac_be =
288*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BE(wmi_stats_buf->dl_inbss_airtime_per_ac);
289*5113495bSYour Name 	param->dl_inbss_airtime_ac_bk =
290*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BK(wmi_stats_buf->dl_inbss_airtime_per_ac);
291*5113495bSYour Name 	param->dl_inbss_airtime_ac_vi =
292*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VI(wmi_stats_buf->dl_inbss_airtime_per_ac);
293*5113495bSYour Name 	param->dl_inbss_airtime_ac_vo =
294*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VO(wmi_stats_buf->dl_inbss_airtime_per_ac);
295*5113495bSYour Name 	param->ul_inbss_airtime_ac_be =
296*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BE(wmi_stats_buf->ul_inbss_airtime_per_ac);
297*5113495bSYour Name 	param->ul_inbss_airtime_ac_bk =
298*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BK(wmi_stats_buf->ul_inbss_airtime_per_ac);
299*5113495bSYour Name 	param->ul_inbss_airtime_ac_vi =
300*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VI(wmi_stats_buf->ul_inbss_airtime_per_ac);
301*5113495bSYour Name 	param->ul_inbss_airtime_ac_vo =
302*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VO(wmi_stats_buf->ul_inbss_airtime_per_ac);
303*5113495bSYour Name 	param->estimated_air_time_ac_be =
304*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BE(wmi_stats_buf->estimated_air_time_per_ac);
305*5113495bSYour Name 	param->estimated_air_time_ac_bk =
306*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_BK(wmi_stats_buf->estimated_air_time_per_ac);
307*5113495bSYour Name 	param->estimated_air_time_ac_vi =
308*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VI(wmi_stats_buf->estimated_air_time_per_ac);
309*5113495bSYour Name 	param->estimated_air_time_ac_vo =
310*5113495bSYour Name 		WMI_PMLO_UL_DL_INBSS_AT_GET_VO(wmi_stats_buf->estimated_air_time_per_ac);
311*5113495bSYour Name 	param->link_obss_airtime =
312*5113495bSYour Name 		WMI_PMLO_LINK_OBSS_AT_GET(wmi_stats_buf->ul_dl_obss_free_aa_word32);
313*5113495bSYour Name 	param->link_idle_airtime =
314*5113495bSYour Name 		WMI_PMLO_LINK_AA_GET(wmi_stats_buf->ul_dl_obss_free_aa_word32);
315*5113495bSYour Name 	param->ul_inbss_airtime_non_ac =
316*5113495bSYour Name 		WMI_PMLO_UL_AIRTIME_NON_AC_GET(wmi_stats_buf->ul_dl_obss_free_aa_word32);
317*5113495bSYour Name 	param->dl_inbss_airtime_non_ac =
318*5113495bSYour Name 		WMI_PMLO_DL_AIRTIME_NON_AC_GET(wmi_stats_buf->ul_dl_obss_free_aa_word32);
319*5113495bSYour Name 	for (idx = 0; idx < WMI_AC_MAX; idx++) {
320*5113495bSYour Name 		param->avg_chan_lat_per_ac[idx] =
321*5113495bSYour Name 				wmi_stats_buf->avg_chan_lat_per_ac[idx];
322*5113495bSYour Name 	}
323*5113495bSYour Name 
324*5113495bSYour Name 	wmi_debug("pdev_id = %u", wmi_stats_buf->pdev_id);
325*5113495bSYour Name 	wmi_debug("dl_inbss_airtime_per_ac = %u, ul_inbss_airtime_per_ac = %u, estimated_air_time_per_ac = %u, ul_dl_obss_free_aa_word32 = %u",
326*5113495bSYour Name 		  wmi_stats_buf->dl_inbss_airtime_per_ac,
327*5113495bSYour Name 		  wmi_stats_buf->ul_inbss_airtime_per_ac,
328*5113495bSYour Name 		  wmi_stats_buf->estimated_air_time_per_ac,
329*5113495bSYour Name 		  wmi_stats_buf->ul_dl_obss_free_aa_word32);
330*5113495bSYour Name 
331*5113495bSYour Name 	for (idx = 0; idx < WMI_AC_MAX; idx++) {
332*5113495bSYour Name 		wmi_debug("avg_chan_lat_per_ac_sample-%u: avg_chan_lat_per_ac=%u",
333*5113495bSYour Name 			  idx,
334*5113495bSYour Name 			  wmi_stats_buf->avg_chan_lat_per_ac[idx]);
335*5113495bSYour Name 	}
336*5113495bSYour Name }
337*5113495bSYour Name 
wmi_pmlo_extract_stats_struct(wmi_unified_t wmi_handle,void * tag_buf,struct infra_cp_stats_event * params)338*5113495bSYour Name static void wmi_pmlo_extract_stats_struct(wmi_unified_t wmi_handle,
339*5113495bSYour Name 					  void *tag_buf,
340*5113495bSYour Name 					  struct infra_cp_stats_event *params)
341*5113495bSYour Name {
342*5113495bSYour Name 	struct ctrl_path_pmlo_telemetry_stats_struct *pmlo_params;
343*5113495bSYour Name 
344*5113495bSYour Name 	pmlo_params = params->telemetry_stats;
345*5113495bSYour Name 	wmi_debug("PMLO TELEMETRY stats struct found");
346*5113495bSYour Name 	wmi_extract_ctrl_path_pmlo_stats_tlv(wmi_handle, tag_buf, pmlo_params);
347*5113495bSYour Name }
348*5113495bSYour Name #else
wmi_pmlo_extract_stats_struct(wmi_unified_t wmi_handle,void * tag_buf,struct infra_cp_stats_event * params)349*5113495bSYour Name static void wmi_pmlo_extract_stats_struct(wmi_unified_t wmi_handle,
350*5113495bSYour Name 					  void *tag_buf,
351*5113495bSYour Name 					  struct infra_cp_stats_event *params)
352*5113495bSYour Name { }
353*5113495bSYour Name #endif
354*5113495bSYour Name 
355*5113495bSYour Name /**
356*5113495bSYour Name  * wmi_stats_extract_tag_struct: function to extract tag structs
357*5113495bSYour Name  * @wmi_handle: wmi handle
358*5113495bSYour Name  * @tag_type: tag type that is to be printed
359*5113495bSYour Name  * @tag_buf: pointer to the tag structure
360*5113495bSYour Name  * @params: buffer to hold parameters extracted from response event
361*5113495bSYour Name  *
362*5113495bSYour Name  * Return: None
363*5113495bSYour Name  */
wmi_stats_extract_tag_struct(wmi_unified_t wmi_handle,uint32_t tag_type,void * tag_buf,struct infra_cp_stats_event * params)364*5113495bSYour Name static void wmi_stats_extract_tag_struct(wmi_unified_t wmi_handle,
365*5113495bSYour Name 					 uint32_t tag_type, void *tag_buf,
366*5113495bSYour Name 					 struct infra_cp_stats_event *params)
367*5113495bSYour Name {
368*5113495bSYour Name 	wmi_debug("tag_type %d", tag_type);
369*5113495bSYour Name 
370*5113495bSYour Name 	switch (tag_type) {
371*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_pdev_stats_struct:
372*5113495bSYour Name 		break;
373*5113495bSYour Name 
374*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_mem_stats_struct:
375*5113495bSYour Name 		break;
376*5113495bSYour Name 
377*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_twt_stats_struct:
378*5113495bSYour Name 		wmi_twt_extract_stats_struct(tag_buf, params);
379*5113495bSYour Name 		break;
380*5113495bSYour Name 
381*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_bmiss_stats_struct:
382*5113495bSYour Name 		wmi_bmiss_extract_stats_struct(tag_buf, params);
383*5113495bSYour Name 		break;
384*5113495bSYour Name 
385*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_pmlo_stats_struct:
386*5113495bSYour Name 		wmi_pmlo_extract_stats_struct(wmi_handle, tag_buf, params);
387*5113495bSYour Name 		break;
388*5113495bSYour Name 
389*5113495bSYour Name 	case WMITLV_TAG_STRUC_wmi_ctrl_path_sta_rrm_stats_struct:
390*5113495bSYour Name 		wmi_rrm_extract_sta_stats_struct(tag_buf, params);
391*5113495bSYour Name 		break;
392*5113495bSYour Name 
393*5113495bSYour Name 	default:
394*5113495bSYour Name 		break;
395*5113495bSYour Name 	}
396*5113495bSYour Name }
397*5113495bSYour Name 
wmi_stats_handler(wmi_unified_t wmi_handle,void * buff,int32_t len,struct infra_cp_stats_event * params)398*5113495bSYour Name QDF_STATUS wmi_stats_handler(wmi_unified_t wmi_handle, void *buff, int32_t len,
399*5113495bSYour Name 			     struct infra_cp_stats_event *params)
400*5113495bSYour Name {
401*5113495bSYour Name 	WMI_CTRL_PATH_STATS_EVENTID_param_tlvs *param_buf;
402*5113495bSYour Name 	wmi_ctrl_path_stats_event_fixed_param *ev;
403*5113495bSYour Name 	uint8_t *buf_ptr = (uint8_t *)buff;
404*5113495bSYour Name 	uint32_t curr_tlv_tag;
405*5113495bSYour Name 	uint32_t curr_tlv_len;
406*5113495bSYour Name 	uint8_t *tag_start_ptr;
407*5113495bSYour Name 
408*5113495bSYour Name 	param_buf = (WMI_CTRL_PATH_STATS_EVENTID_param_tlvs *)buff;
409*5113495bSYour Name 	if (!param_buf) {
410*5113495bSYour Name 		wmi_err_rl("param_buf is NULL");
411*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
412*5113495bSYour Name 	}
413*5113495bSYour Name 	ev = (wmi_ctrl_path_stats_event_fixed_param *)param_buf->fixed_param;
414*5113495bSYour Name 
415*5113495bSYour Name 	curr_tlv_tag = WMITLV_GET_TLVTAG(ev->tlv_header);
416*5113495bSYour Name 	curr_tlv_len = WMITLV_GET_TLVLEN(ev->tlv_header);
417*5113495bSYour Name 	buf_ptr = (uint8_t *)param_buf->fixed_param;
418*5113495bSYour Name 	wmi_debug("Fixed param more %d req_id %d status %d", ev->more,
419*5113495bSYour Name 		  ev->request_id, ev->status);
420*5113495bSYour Name 	params->request_id = ev->request_id;
421*5113495bSYour Name 	params->status = ev->status;
422*5113495bSYour Name 
423*5113495bSYour Name 	/* buffer should point to next TLV in event */
424*5113495bSYour Name 	buf_ptr += (curr_tlv_len + WMI_TLV_HDR_SIZE);
425*5113495bSYour Name 	len -= (curr_tlv_len + WMI_TLV_HDR_SIZE);
426*5113495bSYour Name 
427*5113495bSYour Name 	curr_tlv_tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(buf_ptr));
428*5113495bSYour Name 	curr_tlv_len = WMITLV_GET_TLVLEN(WMITLV_GET_HDR(buf_ptr));
429*5113495bSYour Name 
430*5113495bSYour Name 	wmi_debug("curr_tlv_len %d curr_tlv_tag %d rem_len %d", len,
431*5113495bSYour Name 		  curr_tlv_len, curr_tlv_tag);
432*5113495bSYour Name 
433*5113495bSYour Name 	while ((len >= curr_tlv_len) &&
434*5113495bSYour Name 	       (curr_tlv_tag >= WMITLV_TAG_FIRST_ARRAY_ENUM)) {
435*5113495bSYour Name 		if (curr_tlv_tag == WMITLV_TAG_ARRAY_STRUC) {
436*5113495bSYour Name 			/* Move to next WMITLV_TAG_ARRAY_STRUC */
437*5113495bSYour Name 			buf_ptr += WMI_TLV_HDR_SIZE;
438*5113495bSYour Name 			len -= WMI_TLV_HDR_SIZE;
439*5113495bSYour Name 			if (len <= 0)
440*5113495bSYour Name 				break;
441*5113495bSYour Name 		}
442*5113495bSYour Name 		curr_tlv_tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(buf_ptr));
443*5113495bSYour Name 		curr_tlv_len = WMITLV_GET_TLVLEN(WMITLV_GET_HDR(buf_ptr));
444*5113495bSYour Name 
445*5113495bSYour Name 		wmi_debug("curr_tlv_len %d curr_tlv_tag %d rem_len %d",
446*5113495bSYour Name 			  len, curr_tlv_len, curr_tlv_tag);
447*5113495bSYour Name 		if (curr_tlv_len) {
448*5113495bSYour Name 			/* point to the tag inside WMITLV_TAG_ARRAY_STRUC */
449*5113495bSYour Name 			tag_start_ptr = buf_ptr + WMI_TLV_HDR_SIZE;
450*5113495bSYour Name 			curr_tlv_tag = WMITLV_GET_TLVTAG(
451*5113495bSYour Name 						WMITLV_GET_HDR(tag_start_ptr));
452*5113495bSYour Name 			wmi_stats_extract_tag_struct(wmi_handle, curr_tlv_tag,
453*5113495bSYour Name 						     (void *)tag_start_ptr,
454*5113495bSYour Name 						     params);
455*5113495bSYour Name 			/* Move to next tag */
456*5113495bSYour Name 			buf_ptr += curr_tlv_len + WMI_TLV_HDR_SIZE;
457*5113495bSYour Name 			len -= (curr_tlv_len + WMI_TLV_HDR_SIZE);
458*5113495bSYour Name 		}
459*5113495bSYour Name 		if (len <= 0)
460*5113495bSYour Name 			break;
461*5113495bSYour Name 	}
462*5113495bSYour Name 
463*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
464*5113495bSYour Name }
465*5113495bSYour Name 
466*5113495bSYour Name /**
467*5113495bSYour Name  * extract_infra_cp_stats_tlv - api to extract stats information from
468*5113495bSYour Name  * event buffer
469*5113495bSYour Name  * @wmi_handle:  wmi handle
470*5113495bSYour Name  * @evt_buf:     event buffer
471*5113495bSYour Name  * @evt_buf_len: length of the event buffer
472*5113495bSYour Name  * @params:      buffer to populate more flag
473*5113495bSYour Name  *
474*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, else other qdf error values
475*5113495bSYour Name  */
476*5113495bSYour Name QDF_STATUS
extract_infra_cp_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,uint32_t evt_buf_len,struct infra_cp_stats_event * params)477*5113495bSYour Name extract_infra_cp_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
478*5113495bSYour Name 			   uint32_t evt_buf_len,
479*5113495bSYour Name 			   struct infra_cp_stats_event *params)
480*5113495bSYour Name {
481*5113495bSYour Name 	wmi_stats_handler(wmi_handle, evt_buf, evt_buf_len, params);
482*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
483*5113495bSYour Name }
484*5113495bSYour Name 
485*5113495bSYour Name /**
486*5113495bSYour Name  * prepare_infra_cp_stats_buf() - Allocate and prepare wmi cmd request buffer
487*5113495bSYour Name  * @wmi_handle: wmi handle
488*5113495bSYour Name  * @stats_req: Request parameters to be filled in wmi cmd request buffer
489*5113495bSYour Name  * @req_buf_len: length of the output wmi cmd buffer allocated
490*5113495bSYour Name  *
491*5113495bSYour Name  * Return: Valid wmi buffer pointer on success and NULL pointer for failure
492*5113495bSYour Name  */
493*5113495bSYour Name static wmi_buf_t
prepare_infra_cp_stats_buf(wmi_unified_t wmi_handle,struct infra_cp_stats_cmd_info * stats_req,uint32_t * req_buf_len)494*5113495bSYour Name prepare_infra_cp_stats_buf(wmi_unified_t wmi_handle,
495*5113495bSYour Name 			   struct infra_cp_stats_cmd_info *stats_req,
496*5113495bSYour Name 			   uint32_t *req_buf_len)
497*5113495bSYour Name {
498*5113495bSYour Name 	wmi_request_ctrl_path_stats_cmd_fixed_param *cmd_fixed_param;
499*5113495bSYour Name 	uint32_t index;
500*5113495bSYour Name 	wmi_buf_t req_buf;
501*5113495bSYour Name 	uint8_t *buf_ptr;
502*5113495bSYour Name 	uint32_t *pdev_id_array;
503*5113495bSYour Name 	uint32_t *vdev_id_array;
504*5113495bSYour Name 	uint8_t *mac_addr_array;
505*5113495bSYour Name 	uint32_t *dialog_id_array;
506*5113495bSYour Name 	uint32_t num_pdev_ids = stats_req->num_pdev_ids;
507*5113495bSYour Name 	uint32_t num_vdev_ids = stats_req->num_vdev_ids;
508*5113495bSYour Name 	uint32_t num_mac_addr_list = stats_req->num_mac_addr_list;
509*5113495bSYour Name 	uint32_t num_dialog_ids = INFRA_CP_STATS_MAX_REQ_TWT_DIALOG_ID;
510*5113495bSYour Name 
511*5113495bSYour Name 	/* Calculate total buffer length */
512*5113495bSYour Name 	*req_buf_len = (sizeof(wmi_request_ctrl_path_stats_cmd_fixed_param) +
513*5113495bSYour Name 		       WMI_TLV_HDR_SIZE + (sizeof(A_UINT32) * (num_pdev_ids)) +
514*5113495bSYour Name 		       WMI_TLV_HDR_SIZE + sizeof(A_UINT32) * (num_vdev_ids) +
515*5113495bSYour Name 		       WMI_TLV_HDR_SIZE +
516*5113495bSYour Name 		       sizeof(wmi_mac_addr) * (num_mac_addr_list) +
517*5113495bSYour Name 		       WMI_TLV_HDR_SIZE +
518*5113495bSYour Name 		       (sizeof(A_UINT32) * (num_dialog_ids)));
519*5113495bSYour Name 	req_buf = wmi_buf_alloc(wmi_handle, *req_buf_len);
520*5113495bSYour Name 	if (!req_buf)
521*5113495bSYour Name 		return NULL;
522*5113495bSYour Name 
523*5113495bSYour Name 	cmd_fixed_param = (wmi_request_ctrl_path_stats_cmd_fixed_param *)
524*5113495bSYour Name 				wmi_buf_data(req_buf);
525*5113495bSYour Name 
526*5113495bSYour Name 	/*Set TLV header*/
527*5113495bSYour Name 	WMITLV_SET_HDR(&cmd_fixed_param->tlv_header,
528*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_request_ctrl_path_stats_cmd_fixed_param,
529*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
530*5113495bSYour Name 				wmi_request_ctrl_path_stats_cmd_fixed_param));
531*5113495bSYour Name 
532*5113495bSYour Name 	index = get_infra_cp_stats_id(stats_req->stats_id);
533*5113495bSYour Name 	cmd_fixed_param->stats_id_mask = (1 << index);
534*5113495bSYour Name 
535*5113495bSYour Name 	cmd_fixed_param->request_id = stats_req->request_id;
536*5113495bSYour Name 	cmd_fixed_param->action = get_infra_cp_stats_action(stats_req->action);
537*5113495bSYour Name 	cmd_fixed_param->stat_periodicity = stats_req->stat_periodicity;
538*5113495bSYour Name 
539*5113495bSYour Name 	buf_ptr = (uint8_t *)cmd_fixed_param;
540*5113495bSYour Name 	/* Setting tlv header for pdev id arrays*/
541*5113495bSYour Name 	buf_ptr = buf_ptr + sizeof(*cmd_fixed_param);
542*5113495bSYour Name 	pdev_id_array = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE);
543*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,  WMITLV_TAG_ARRAY_UINT32,
544*5113495bSYour Name 		       sizeof(A_UINT32) * num_pdev_ids);
545*5113495bSYour Name 
546*5113495bSYour Name 	/* Setting tlv header for vdev id arrays*/
547*5113495bSYour Name 	buf_ptr = buf_ptr + WMI_TLV_HDR_SIZE +
548*5113495bSYour Name 		  (sizeof(A_UINT32) * num_pdev_ids);
549*5113495bSYour Name 	vdev_id_array = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE);
550*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
551*5113495bSYour Name 		       sizeof(A_UINT32) * num_vdev_ids);
552*5113495bSYour Name 
553*5113495bSYour Name 	/* Setting tlv header for mac addr arrays*/
554*5113495bSYour Name 	buf_ptr = buf_ptr + WMI_TLV_HDR_SIZE +
555*5113495bSYour Name 		  (sizeof(A_UINT32) * num_vdev_ids);
556*5113495bSYour Name 	mac_addr_array = buf_ptr + WMI_TLV_HDR_SIZE;
557*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_FIXED_STRUC,
558*5113495bSYour Name 		       sizeof(wmi_mac_addr) * num_mac_addr_list);
559*5113495bSYour Name 
560*5113495bSYour Name 	/* Setting tlv header for dialog id arrays*/
561*5113495bSYour Name 	buf_ptr = buf_ptr + WMI_TLV_HDR_SIZE +
562*5113495bSYour Name 		  sizeof(wmi_mac_addr) * num_mac_addr_list;
563*5113495bSYour Name 	dialog_id_array = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE);
564*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
565*5113495bSYour Name 		       sizeof(A_UINT32) * num_dialog_ids);
566*5113495bSYour Name 
567*5113495bSYour Name 	for (index = 0; index < num_pdev_ids; index++) {
568*5113495bSYour Name 		pdev_id_array[index] =
569*5113495bSYour Name 			wmi_handle->ops->convert_pdev_id_host_to_target(
570*5113495bSYour Name 					wmi_handle,
571*5113495bSYour Name 					stats_req->pdev_id[index]);
572*5113495bSYour Name 	}
573*5113495bSYour Name 
574*5113495bSYour Name 	for (index = 0; index < num_vdev_ids; index++)
575*5113495bSYour Name 		vdev_id_array[index] = stats_req->vdev_id[index];
576*5113495bSYour Name 
577*5113495bSYour Name 	for (index = 0; index < num_mac_addr_list; index++) {
578*5113495bSYour Name 		qdf_mem_copy(mac_addr_array, stats_req->peer_mac_addr[index],
579*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
580*5113495bSYour Name 		mac_addr_array += QDF_MAC_ADDR_SIZE;
581*5113495bSYour Name 	}
582*5113495bSYour Name 
583*5113495bSYour Name 	dialog_id_array[0] = get_stats_req_twt_dialog_id(stats_req);
584*5113495bSYour Name 
585*5113495bSYour Name 	wmi_debug("stats_id_mask 0x%x action 0x%x dialog_id %d",
586*5113495bSYour Name 		  cmd_fixed_param->stats_id_mask, cmd_fixed_param->action,
587*5113495bSYour Name 		  dialog_id_array[0]);
588*5113495bSYour Name 	wmi_debug("num_pdev_ids %d num_vdev_ids %d num_dialog_ids %d \
589*5113495bSYour Name 		   num_mac_addr %d", num_pdev_ids, num_vdev_ids,
590*5113495bSYour Name 		   num_dialog_ids, num_mac_addr_list);
591*5113495bSYour Name 
592*5113495bSYour Name 	return req_buf;
593*5113495bSYour Name }
594*5113495bSYour Name 
595*5113495bSYour Name /**
596*5113495bSYour Name  * send_infra_cp_stats_request_cmd_tlv() - Prepare and send infra_cp_stats
597*5113495bSYour Name  * wmi cmd to firmware
598*5113495bSYour Name  * @wmi_handle: wmi handle
599*5113495bSYour Name  * @param: Pointer to request structure
600*5113495bSYour Name  *
601*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes
602*5113495bSYour Name  * on failure
603*5113495bSYour Name  */
604*5113495bSYour Name static QDF_STATUS
send_infra_cp_stats_request_cmd_tlv(wmi_unified_t wmi_handle,struct infra_cp_stats_cmd_info * param)605*5113495bSYour Name send_infra_cp_stats_request_cmd_tlv(wmi_unified_t wmi_handle,
606*5113495bSYour Name 				    struct infra_cp_stats_cmd_info *param)
607*5113495bSYour Name {
608*5113495bSYour Name 	uint32_t len;
609*5113495bSYour Name 	wmi_buf_t buf;
610*5113495bSYour Name 	QDF_STATUS status;
611*5113495bSYour Name 
612*5113495bSYour Name 	buf = prepare_infra_cp_stats_buf(wmi_handle, param, &len);
613*5113495bSYour Name 	if (!buf)
614*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
615*5113495bSYour Name 
616*5113495bSYour Name 	wmi_debug("buf_len %d", len);
617*5113495bSYour Name 
618*5113495bSYour Name 	wmi_mtrace(WMI_REQUEST_CTRL_PATH_STATS_CMDID, NO_SESSION, 0);
619*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
620*5113495bSYour Name 				      len, WMI_REQUEST_CTRL_PATH_STATS_CMDID);
621*5113495bSYour Name 
622*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
623*5113495bSYour Name 		wmi_buf_free(buf);
624*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
625*5113495bSYour Name 	}
626*5113495bSYour Name 
627*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
628*5113495bSYour Name }
629*5113495bSYour Name #else
630*5113495bSYour Name static inline QDF_STATUS
send_infra_cp_stats_request_cmd_tlv(wmi_unified_t wmi_handle,struct infra_cp_stats_cmd_info * param)631*5113495bSYour Name send_infra_cp_stats_request_cmd_tlv(wmi_unified_t wmi_handle,
632*5113495bSYour Name 				    struct infra_cp_stats_cmd_info *param)
633*5113495bSYour Name {
634*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
635*5113495bSYour Name }
636*5113495bSYour Name #endif
637*5113495bSYour Name 
638*5113495bSYour Name #ifdef QCA_WIFI_EMULATION
639*5113495bSYour Name /**
640*5113495bSYour Name  * send_stats_request_cmd_tlv() - WMI request stats function
641*5113495bSYour Name  * @wmi_handle: handle to WMI.
642*5113495bSYour Name  * @macaddr: MAC address
643*5113495bSYour Name  * @param: pointer to hold stats request parameter
644*5113495bSYour Name  *
645*5113495bSYour Name  * Return: QDF_STATUS on success, else failure.
646*5113495bSYour Name  */
647*5113495bSYour Name static QDF_STATUS
send_stats_request_cmd_tlv(wmi_unified_t wmi_handle,uint8_t macaddr[QDF_MAC_ADDR_SIZE],struct stats_request_params * param)648*5113495bSYour Name send_stats_request_cmd_tlv(wmi_unified_t wmi_handle,
649*5113495bSYour Name 			   uint8_t macaddr[QDF_MAC_ADDR_SIZE],
650*5113495bSYour Name 			   struct stats_request_params *param)
651*5113495bSYour Name {
652*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
653*5113495bSYour Name }
654*5113495bSYour Name #else
655*5113495bSYour Name static QDF_STATUS
send_stats_request_cmd_tlv(wmi_unified_t wmi_handle,uint8_t macaddr[QDF_MAC_ADDR_SIZE],struct stats_request_params * param)656*5113495bSYour Name send_stats_request_cmd_tlv(wmi_unified_t wmi_handle,
657*5113495bSYour Name 			   uint8_t macaddr[QDF_MAC_ADDR_SIZE],
658*5113495bSYour Name 			   struct stats_request_params *param)
659*5113495bSYour Name {
660*5113495bSYour Name 	int32_t ret;
661*5113495bSYour Name 	wmi_request_stats_cmd_fixed_param *cmd;
662*5113495bSYour Name 	wmi_buf_t buf;
663*5113495bSYour Name 	uint16_t len = sizeof(wmi_request_stats_cmd_fixed_param);
664*5113495bSYour Name 	bool is_qmi_send_support;
665*5113495bSYour Name 
666*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
667*5113495bSYour Name 	if (!buf)
668*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
669*5113495bSYour Name 
670*5113495bSYour Name 	cmd = (wmi_request_stats_cmd_fixed_param *) wmi_buf_data(buf);
671*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
672*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_request_stats_cmd_fixed_param,
673*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
674*5113495bSYour Name 			       (wmi_request_stats_cmd_fixed_param));
675*5113495bSYour Name 	cmd->stats_id = param->stats_id;
676*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
677*5113495bSYour Name 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
678*5113495bSYour Name 							wmi_handle,
679*5113495bSYour Name 							param->pdev_id);
680*5113495bSYour Name 	is_qmi_send_support = param->is_qmi_send_support;
681*5113495bSYour Name 
682*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(macaddr, &cmd->peer_macaddr);
683*5113495bSYour Name 
684*5113495bSYour Name 	wmi_debug("STATS REQ STATS_ID:%d VDEV_ID:%d PDEV_ID:%d, is_qmi_send_support %d",
685*5113495bSYour Name 		  cmd->stats_id, cmd->vdev_id, cmd->pdev_id,
686*5113495bSYour Name 		  is_qmi_send_support);
687*5113495bSYour Name 
688*5113495bSYour Name 	wmi_mtrace(WMI_REQUEST_STATS_CMDID, cmd->vdev_id, 0);
689*5113495bSYour Name 	ret = wmi_unified_cmd_send_pm_chk(wmi_handle, buf, len,
690*5113495bSYour Name 					  WMI_REQUEST_STATS_CMDID,
691*5113495bSYour Name 					  is_qmi_send_support);
692*5113495bSYour Name 
693*5113495bSYour Name 	if (ret) {
694*5113495bSYour Name 		wmi_err("Failed to send stats request to fw =%d", ret);
695*5113495bSYour Name 		wmi_buf_free(buf);
696*5113495bSYour Name 	}
697*5113495bSYour Name 
698*5113495bSYour Name 	return qdf_status_from_os_return(ret);
699*5113495bSYour Name }
700*5113495bSYour Name #endif
701*5113495bSYour Name 
702*5113495bSYour Name #ifdef WLAN_FEATURE_BIG_DATA_STATS
703*5113495bSYour Name /**
704*5113495bSYour Name  * send_big_data_stats_request_cmd_tlv () - send big data stats cmd
705*5113495bSYour Name  * @wmi_handle: wmi handle
706*5113495bSYour Name  * @param: pointer to command request param
707*5113495bSYour Name  *
708*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
709*5113495bSYour Name  */
710*5113495bSYour Name static QDF_STATUS
send_big_data_stats_request_cmd_tlv(wmi_unified_t wmi_handle,struct stats_request_params * param)711*5113495bSYour Name send_big_data_stats_request_cmd_tlv(wmi_unified_t wmi_handle,
712*5113495bSYour Name 				    struct stats_request_params *param)
713*5113495bSYour Name {
714*5113495bSYour Name 	int32_t ret = 0;
715*5113495bSYour Name 	wmi_vdev_get_big_data_p2_cmd_fixed_param *cmd;
716*5113495bSYour Name 	wmi_buf_t buf;
717*5113495bSYour Name 	uint16_t len = sizeof(wmi_vdev_get_big_data_p2_cmd_fixed_param);
718*5113495bSYour Name 
719*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
720*5113495bSYour Name 	if (!buf)
721*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
722*5113495bSYour Name 
723*5113495bSYour Name 	cmd = (wmi_vdev_get_big_data_p2_cmd_fixed_param *)wmi_buf_data(buf);
724*5113495bSYour Name 	WMITLV_SET_HDR(
725*5113495bSYour Name 		&cmd->tlv_header,
726*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_vdev_get_big_data_p2_cmd_fixed_param,
727*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
728*5113495bSYour Name 		(wmi_vdev_get_big_data_p2_cmd_fixed_param));
729*5113495bSYour Name 
730*5113495bSYour Name 	cmd->vdev_id = param->vdev_id;
731*5113495bSYour Name 
732*5113495bSYour Name 	wmi_debug("STATS VDEV_ID:%d -->", cmd->vdev_id);
733*5113495bSYour Name 
734*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_GET_BIG_DATA_P2_CMDID, cmd->vdev_id, 0);
735*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
736*5113495bSYour Name 				   WMI_VDEV_GET_BIG_DATA_P2_CMDID);
737*5113495bSYour Name 
738*5113495bSYour Name 	if (ret) {
739*5113495bSYour Name 		wmi_err("Failed to send big data stats request to fw =%d", ret);
740*5113495bSYour Name 		wmi_buf_free(buf);
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	return qdf_status_from_os_return(ret);
744*5113495bSYour Name }
745*5113495bSYour Name #endif
746*5113495bSYour Name 
747*5113495bSYour Name /**
748*5113495bSYour Name  * extract_all_stats_counts_tlv() - extract all stats count from event
749*5113495bSYour Name  * @wmi_handle: wmi handle
750*5113495bSYour Name  * @evt_buf: pointer to event buffer
751*5113495bSYour Name  * @stats_param: Pointer to hold stats count
752*5113495bSYour Name  *
753*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
754*5113495bSYour Name  */
755*5113495bSYour Name static QDF_STATUS
extract_all_stats_counts_tlv(wmi_unified_t wmi_handle,void * evt_buf,wmi_host_stats_event * stats_param)756*5113495bSYour Name extract_all_stats_counts_tlv(wmi_unified_t wmi_handle, void *evt_buf,
757*5113495bSYour Name 			     wmi_host_stats_event *stats_param)
758*5113495bSYour Name {
759*5113495bSYour Name 	wmi_stats_event_fixed_param *ev;
760*5113495bSYour Name 	wmi_per_chain_rssi_stats *rssi_event;
761*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
762*5113495bSYour Name 	uint64_t min_data_len;
763*5113495bSYour Name 	uint32_t i;
764*5113495bSYour Name 
765*5113495bSYour Name 	qdf_mem_zero(stats_param, sizeof(*stats_param));
766*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *) evt_buf;
767*5113495bSYour Name 	ev = (wmi_stats_event_fixed_param *) param_buf->fixed_param;
768*5113495bSYour Name 	rssi_event = param_buf->chain_stats;
769*5113495bSYour Name 	if (!ev) {
770*5113495bSYour Name 		wmi_err("event fixed param NULL");
771*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
772*5113495bSYour Name 	}
773*5113495bSYour Name 
774*5113495bSYour Name 	if (param_buf->num_data > WMI_SVC_MSG_MAX_SIZE - sizeof(*ev)) {
775*5113495bSYour Name 		wmi_err("num_data : %u is invalid", param_buf->num_data);
776*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
777*5113495bSYour Name 	}
778*5113495bSYour Name 
779*5113495bSYour Name 	for (i = 1; i <= WMI_REQUEST_PDEV_TELEMETRY_STAT; i = i << 1) {
780*5113495bSYour Name 		switch (ev->stats_id & i) {
781*5113495bSYour Name 		case WMI_REQUEST_PEER_STAT:
782*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_PEER_STAT;
783*5113495bSYour Name 			break;
784*5113495bSYour Name 
785*5113495bSYour Name 		case WMI_REQUEST_AP_STAT:
786*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_AP_STAT;
787*5113495bSYour Name 			break;
788*5113495bSYour Name 
789*5113495bSYour Name 		case WMI_REQUEST_PDEV_STAT:
790*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_PDEV_STAT;
791*5113495bSYour Name 			break;
792*5113495bSYour Name 
793*5113495bSYour Name 		case WMI_REQUEST_VDEV_STAT:
794*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_VDEV_STAT;
795*5113495bSYour Name 			break;
796*5113495bSYour Name 
797*5113495bSYour Name 		case WMI_REQUEST_BCNFLT_STAT:
798*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_BCNFLT_STAT;
799*5113495bSYour Name 			break;
800*5113495bSYour Name 
801*5113495bSYour Name 		case WMI_REQUEST_VDEV_RATE_STAT:
802*5113495bSYour Name 			stats_param->stats_id |=
803*5113495bSYour Name 				WMI_HOST_REQUEST_VDEV_RATE_STAT;
804*5113495bSYour Name 			break;
805*5113495bSYour Name 
806*5113495bSYour Name 		case WMI_REQUEST_BCN_STAT:
807*5113495bSYour Name 			stats_param->stats_id |= WMI_HOST_REQUEST_BCN_STAT;
808*5113495bSYour Name 			break;
809*5113495bSYour Name 		case WMI_REQUEST_PEER_EXTD_STAT:
810*5113495bSYour Name 			stats_param->stats_id |= WMI_REQUEST_PEER_EXTD_STAT;
811*5113495bSYour Name 			break;
812*5113495bSYour Name 
813*5113495bSYour Name 		case WMI_REQUEST_PEER_EXTD2_STAT:
814*5113495bSYour Name 			stats_param->stats_id |=
815*5113495bSYour Name 				WMI_HOST_REQUEST_PEER_ADV_STATS;
816*5113495bSYour Name 			break;
817*5113495bSYour Name 
818*5113495bSYour Name 		case WMI_REQUEST_PMF_BCN_PROTECT_STAT:
819*5113495bSYour Name 			stats_param->stats_id |=
820*5113495bSYour Name 				WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT;
821*5113495bSYour Name 			break;
822*5113495bSYour Name 
823*5113495bSYour Name 		case WMI_REQUEST_VDEV_EXTD_STAT:
824*5113495bSYour Name 			stats_param->stats_id |=
825*5113495bSYour Name 				WMI_HOST_REQUEST_VDEV_PRB_FILS_STAT;
826*5113495bSYour Name 			break;
827*5113495bSYour Name 
828*5113495bSYour Name 		case WMI_REQUEST_PDEV_EXTD_STAT:
829*5113495bSYour Name 			stats_param->stats_id |=
830*5113495bSYour Name 				WMI_HOST_REQUEST_PDEV_EXTD_STAT;
831*5113495bSYour Name 			break;
832*5113495bSYour Name 
833*5113495bSYour Name 		case WMI_REQUEST_PDEV_TELEMETRY_STAT:
834*5113495bSYour Name 			stats_param->stats_id |=
835*5113495bSYour Name 				WMI_HOST_REQUEST_PDEV_TELEMETRY_STAT;
836*5113495bSYour Name 			break;
837*5113495bSYour Name 		}
838*5113495bSYour Name 	}
839*5113495bSYour Name 
840*5113495bSYour Name 	/* ev->num_*_stats may cause uint32_t overflow, so use uint64_t
841*5113495bSYour Name 	 * to save total length calculated
842*5113495bSYour Name 	 */
843*5113495bSYour Name 	min_data_len =
844*5113495bSYour Name 		(((uint64_t)ev->num_pdev_stats) * sizeof(wmi_pdev_stats)) +
845*5113495bSYour Name 		(((uint64_t)ev->num_vdev_stats) * sizeof(wmi_vdev_stats)) +
846*5113495bSYour Name 		(((uint64_t)ev->num_peer_stats) * sizeof(wmi_peer_stats)) +
847*5113495bSYour Name 		(((uint64_t)ev->num_bcnflt_stats) *
848*5113495bSYour Name 		 sizeof(wmi_bcnfilter_stats_t)) +
849*5113495bSYour Name 		(((uint64_t)ev->num_chan_stats) * sizeof(wmi_chan_stats)) +
850*5113495bSYour Name 		(((uint64_t)ev->num_mib_stats) * sizeof(wmi_mib_stats)) +
851*5113495bSYour Name 		(((uint64_t)ev->num_bcn_stats) * sizeof(wmi_bcn_stats)) +
852*5113495bSYour Name 		(((uint64_t)ev->num_peer_extd_stats) *
853*5113495bSYour Name 		 sizeof(wmi_peer_extd_stats)) +
854*5113495bSYour Name 		(((uint64_t)ev->num_mib_extd_stats) *
855*5113495bSYour Name 		 sizeof(wmi_mib_extd_stats));
856*5113495bSYour Name 	if (param_buf->num_data != min_data_len) {
857*5113495bSYour Name 		wmi_err("data len: %u isn't same as calculated: %llu",
858*5113495bSYour Name 			 param_buf->num_data, min_data_len);
859*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
860*5113495bSYour Name 	}
861*5113495bSYour Name 
862*5113495bSYour Name 	stats_param->last_event = ev->last_event;
863*5113495bSYour Name 	stats_param->num_pdev_stats = ev->num_pdev_stats;
864*5113495bSYour Name 	stats_param->num_pdev_ext_stats = param_buf->num_pdev_extd_stats;
865*5113495bSYour Name 	stats_param->num_vdev_stats = ev->num_vdev_stats;
866*5113495bSYour Name 	stats_param->num_peer_stats = ev->num_peer_stats;
867*5113495bSYour Name 	stats_param->num_peer_extd_stats = ev->num_peer_extd_stats;
868*5113495bSYour Name 	stats_param->num_bcnflt_stats = ev->num_bcnflt_stats;
869*5113495bSYour Name 	stats_param->num_chan_stats = ev->num_chan_stats;
870*5113495bSYour Name 	stats_param->num_mib_stats = ev->num_mib_stats;
871*5113495bSYour Name 	stats_param->num_mib_extd_stats = ev->num_mib_extd_stats;
872*5113495bSYour Name 	stats_param->num_bcn_stats = ev->num_bcn_stats;
873*5113495bSYour Name 	stats_param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
874*5113495bSYour Name 							wmi_handle,
875*5113495bSYour Name 							ev->pdev_id);
876*5113495bSYour Name 
877*5113495bSYour Name 	/* if chain_stats is not populated */
878*5113495bSYour Name 	if (!param_buf->chain_stats || !param_buf->num_chain_stats)
879*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
880*5113495bSYour Name 
881*5113495bSYour Name 	if (WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats !=
882*5113495bSYour Name 	    WMITLV_GET_TLVTAG(rssi_event->tlv_header))
883*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
884*5113495bSYour Name 
885*5113495bSYour Name 	if (WMITLV_GET_STRUCT_TLVLEN(wmi_per_chain_rssi_stats) !=
886*5113495bSYour Name 	    WMITLV_GET_TLVLEN(rssi_event->tlv_header))
887*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
888*5113495bSYour Name 
889*5113495bSYour Name 	if (rssi_event->num_per_chain_rssi_stats >=
890*5113495bSYour Name 	    WMITLV_GET_TLVLEN(rssi_event->tlv_header)) {
891*5113495bSYour Name 		wmi_err("num_per_chain_rssi_stats:%u is out of bounds",
892*5113495bSYour Name 			 rssi_event->num_per_chain_rssi_stats);
893*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
894*5113495bSYour Name 	}
895*5113495bSYour Name 	stats_param->num_rssi_stats = rssi_event->num_per_chain_rssi_stats;
896*5113495bSYour Name 
897*5113495bSYour Name 	if (param_buf->vdev_extd_stats)
898*5113495bSYour Name 		stats_param->num_vdev_extd_stats =
899*5113495bSYour Name 			param_buf->num_vdev_extd_stats;
900*5113495bSYour Name 
901*5113495bSYour Name 	/* if peer_adv_stats is not populated */
902*5113495bSYour Name 	if (param_buf->num_peer_extd2_stats)
903*5113495bSYour Name 		stats_param->num_peer_adv_stats =
904*5113495bSYour Name 			param_buf->num_peer_extd2_stats;
905*5113495bSYour Name 
906*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
907*5113495bSYour Name }
908*5113495bSYour Name 
909*5113495bSYour Name /**
910*5113495bSYour Name  * extract_pdev_tx_stats() - extract pdev tx stats from event
911*5113495bSYour Name  * @tx: destination
912*5113495bSYour Name  * @tx_stats: source event data
913*5113495bSYour Name  */
extract_pdev_tx_stats(wmi_host_dbg_tx_stats * tx,struct wlan_dbg_tx_stats * tx_stats)914*5113495bSYour Name static void extract_pdev_tx_stats(wmi_host_dbg_tx_stats *tx,
915*5113495bSYour Name 				  struct wlan_dbg_tx_stats *tx_stats)
916*5113495bSYour Name {
917*5113495bSYour Name 	/* Tx Stats */
918*5113495bSYour Name 	tx->comp_queued = tx_stats->comp_queued;
919*5113495bSYour Name 	tx->comp_delivered = tx_stats->comp_delivered;
920*5113495bSYour Name 	tx->msdu_enqued = tx_stats->msdu_enqued;
921*5113495bSYour Name 	tx->mpdu_enqued = tx_stats->mpdu_enqued;
922*5113495bSYour Name 	tx->wmm_drop = tx_stats->wmm_drop;
923*5113495bSYour Name 	tx->local_enqued = tx_stats->local_enqued;
924*5113495bSYour Name 	tx->local_freed = tx_stats->local_freed;
925*5113495bSYour Name 	tx->hw_queued = tx_stats->hw_queued;
926*5113495bSYour Name 	tx->hw_reaped = tx_stats->hw_reaped;
927*5113495bSYour Name 	tx->underrun = tx_stats->underrun;
928*5113495bSYour Name 	tx->tx_abort = tx_stats->tx_abort;
929*5113495bSYour Name 	tx->mpdus_requed = tx_stats->mpdus_requed;
930*5113495bSYour Name 	tx->data_rc = tx_stats->data_rc;
931*5113495bSYour Name 	tx->self_triggers = tx_stats->self_triggers;
932*5113495bSYour Name 	tx->sw_retry_failure = tx_stats->sw_retry_failure;
933*5113495bSYour Name 	tx->illgl_rate_phy_err = tx_stats->illgl_rate_phy_err;
934*5113495bSYour Name 	tx->pdev_cont_xretry = tx_stats->pdev_cont_xretry;
935*5113495bSYour Name 	tx->pdev_tx_timeout = tx_stats->pdev_tx_timeout;
936*5113495bSYour Name 	tx->pdev_resets = tx_stats->pdev_resets;
937*5113495bSYour Name 	tx->stateless_tid_alloc_failure = tx_stats->stateless_tid_alloc_failure;
938*5113495bSYour Name 	tx->phy_underrun = tx_stats->phy_underrun;
939*5113495bSYour Name 	tx->txop_ovf = tx_stats->txop_ovf;
940*5113495bSYour Name 
941*5113495bSYour Name 	return;
942*5113495bSYour Name }
943*5113495bSYour Name 
944*5113495bSYour Name 
945*5113495bSYour Name /**
946*5113495bSYour Name  * extract_pdev_rx_stats() - extract pdev rx stats from event
947*5113495bSYour Name  * @rx: destination
948*5113495bSYour Name  * @rx_stats: source event data
949*5113495bSYour Name  */
extract_pdev_rx_stats(wmi_host_dbg_rx_stats * rx,struct wlan_dbg_rx_stats * rx_stats)950*5113495bSYour Name static void extract_pdev_rx_stats(wmi_host_dbg_rx_stats *rx,
951*5113495bSYour Name 				  struct wlan_dbg_rx_stats *rx_stats)
952*5113495bSYour Name {
953*5113495bSYour Name 	/* Rx Stats */
954*5113495bSYour Name 	rx->mid_ppdu_route_change = rx_stats->mid_ppdu_route_change;
955*5113495bSYour Name 	rx->status_rcvd = rx_stats->status_rcvd;
956*5113495bSYour Name 	rx->r0_frags = rx_stats->r0_frags;
957*5113495bSYour Name 	rx->r1_frags = rx_stats->r1_frags;
958*5113495bSYour Name 	rx->r2_frags = rx_stats->r2_frags;
959*5113495bSYour Name 	/* Only TLV */
960*5113495bSYour Name 	rx->r3_frags = 0;
961*5113495bSYour Name 	rx->htt_msdus = rx_stats->htt_msdus;
962*5113495bSYour Name 	rx->htt_mpdus = rx_stats->htt_mpdus;
963*5113495bSYour Name 	rx->loc_msdus = rx_stats->loc_msdus;
964*5113495bSYour Name 	rx->loc_mpdus = rx_stats->loc_mpdus;
965*5113495bSYour Name 	rx->oversize_amsdu = rx_stats->oversize_amsdu;
966*5113495bSYour Name 	rx->phy_errs = rx_stats->phy_errs;
967*5113495bSYour Name 	rx->phy_err_drop = rx_stats->phy_err_drop;
968*5113495bSYour Name 	rx->mpdu_errs = rx_stats->mpdu_errs;
969*5113495bSYour Name 
970*5113495bSYour Name 	return;
971*5113495bSYour Name }
972*5113495bSYour Name 
973*5113495bSYour Name /**
974*5113495bSYour Name  * extract_pdev_stats_tlv() - extract pdev stats from event
975*5113495bSYour Name  * @wmi_handle: wmi handle
976*5113495bSYour Name  * @evt_buf: pointer to event buffer
977*5113495bSYour Name  * @index: Index into pdev stats
978*5113495bSYour Name  * @pdev_stats: Pointer to hold pdev stats
979*5113495bSYour Name  *
980*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
981*5113495bSYour Name  */
982*5113495bSYour Name static QDF_STATUS
extract_pdev_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,uint32_t index,wmi_host_pdev_stats * pdev_stats)983*5113495bSYour Name extract_pdev_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index,
984*5113495bSYour Name 		       wmi_host_pdev_stats *pdev_stats)
985*5113495bSYour Name {
986*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
987*5113495bSYour Name 	wmi_stats_event_fixed_param *ev_param;
988*5113495bSYour Name 	uint8_t *data;
989*5113495bSYour Name 
990*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *) evt_buf;
991*5113495bSYour Name 	ev_param = (wmi_stats_event_fixed_param *) param_buf->fixed_param;
992*5113495bSYour Name 	pdev_stats->pdev_id =
993*5113495bSYour Name 	     wmi_handle->ops->convert_target_pdev_id_to_host(wmi_handle,
994*5113495bSYour Name 							     ev_param->pdev_id);
995*5113495bSYour Name 
996*5113495bSYour Name 	data = param_buf->data;
997*5113495bSYour Name 
998*5113495bSYour Name 	if (index < ev_param->num_pdev_stats) {
999*5113495bSYour Name 		wmi_pdev_stats *ev = (wmi_pdev_stats *) ((data) +
1000*5113495bSYour Name 				(index * sizeof(wmi_pdev_stats)));
1001*5113495bSYour Name 
1002*5113495bSYour Name 		pdev_stats->chan_nf = ev->chan_nf;
1003*5113495bSYour Name 		pdev_stats->tx_frame_count = ev->tx_frame_count;
1004*5113495bSYour Name 		pdev_stats->rx_frame_count = ev->rx_frame_count;
1005*5113495bSYour Name 		pdev_stats->rx_clear_count = ev->rx_clear_count;
1006*5113495bSYour Name 		pdev_stats->cycle_count = ev->cycle_count;
1007*5113495bSYour Name 		pdev_stats->phy_err_count = ev->phy_err_count;
1008*5113495bSYour Name 		pdev_stats->chan_tx_pwr = ev->chan_tx_pwr;
1009*5113495bSYour Name 
1010*5113495bSYour Name 		extract_pdev_tx_stats(&(pdev_stats->pdev_stats.tx),
1011*5113495bSYour Name 			&(ev->pdev_stats.tx));
1012*5113495bSYour Name 		extract_pdev_rx_stats(&(pdev_stats->pdev_stats.rx),
1013*5113495bSYour Name 			&(ev->pdev_stats.rx));
1014*5113495bSYour Name 	}
1015*5113495bSYour Name 
1016*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1017*5113495bSYour Name }
1018*5113495bSYour Name 
1019*5113495bSYour Name /**
1020*5113495bSYour Name  * extract_vdev_stats_tlv() - extract vdev stats from event
1021*5113495bSYour Name  * @wmi_handle: wmi handle
1022*5113495bSYour Name  * @evt_buf: pointer to event buffer
1023*5113495bSYour Name  * @index: Index into vdev stats
1024*5113495bSYour Name  * @vdev_stats: Pointer to hold vdev stats
1025*5113495bSYour Name  *
1026*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1027*5113495bSYour Name  */
extract_vdev_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,uint32_t index,wmi_host_vdev_stats * vdev_stats)1028*5113495bSYour Name static QDF_STATUS extract_vdev_stats_tlv(wmi_unified_t wmi_handle,
1029*5113495bSYour Name 	void *evt_buf, uint32_t index, wmi_host_vdev_stats *vdev_stats)
1030*5113495bSYour Name {
1031*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
1032*5113495bSYour Name 	wmi_stats_event_fixed_param *ev_param;
1033*5113495bSYour Name 	uint8_t *data;
1034*5113495bSYour Name 
1035*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *) evt_buf;
1036*5113495bSYour Name 	ev_param = (wmi_stats_event_fixed_param *) param_buf->fixed_param;
1037*5113495bSYour Name 	data = (uint8_t *) param_buf->data;
1038*5113495bSYour Name 
1039*5113495bSYour Name 	if (index < ev_param->num_vdev_stats) {
1040*5113495bSYour Name 		wmi_vdev_stats *ev = (wmi_vdev_stats *) ((data) +
1041*5113495bSYour Name 				((ev_param->num_pdev_stats) *
1042*5113495bSYour Name 				sizeof(wmi_pdev_stats)) +
1043*5113495bSYour Name 				(index * sizeof(wmi_vdev_stats)));
1044*5113495bSYour Name 
1045*5113495bSYour Name 		vdev_stats->vdev_id = ev->vdev_id;
1046*5113495bSYour Name 		vdev_stats->vdev_snr.bcn_snr = ev->vdev_snr.bcn_snr;
1047*5113495bSYour Name 		vdev_stats->vdev_snr.dat_snr = ev->vdev_snr.dat_snr;
1048*5113495bSYour Name 
1049*5113495bSYour Name 		OS_MEMCPY(vdev_stats->tx_frm_cnt, ev->tx_frm_cnt,
1050*5113495bSYour Name 			sizeof(ev->tx_frm_cnt));
1051*5113495bSYour Name 		vdev_stats->rx_frm_cnt = ev->rx_frm_cnt;
1052*5113495bSYour Name 		OS_MEMCPY(vdev_stats->multiple_retry_cnt,
1053*5113495bSYour Name 				ev->multiple_retry_cnt,
1054*5113495bSYour Name 				sizeof(ev->multiple_retry_cnt));
1055*5113495bSYour Name 		OS_MEMCPY(vdev_stats->fail_cnt, ev->fail_cnt,
1056*5113495bSYour Name 				sizeof(ev->fail_cnt));
1057*5113495bSYour Name 		vdev_stats->rts_fail_cnt = ev->rts_fail_cnt;
1058*5113495bSYour Name 		vdev_stats->rts_succ_cnt = ev->rts_succ_cnt;
1059*5113495bSYour Name 		vdev_stats->rx_err_cnt = ev->rx_err_cnt;
1060*5113495bSYour Name 		vdev_stats->rx_discard_cnt = ev->rx_discard_cnt;
1061*5113495bSYour Name 		vdev_stats->ack_fail_cnt = ev->ack_fail_cnt;
1062*5113495bSYour Name 		OS_MEMCPY(vdev_stats->tx_rate_history, ev->tx_rate_history,
1063*5113495bSYour Name 			sizeof(ev->tx_rate_history));
1064*5113495bSYour Name 		OS_MEMCPY(vdev_stats->bcn_rssi_history, ev->bcn_rssi_history,
1065*5113495bSYour Name 			sizeof(ev->bcn_rssi_history));
1066*5113495bSYour Name 
1067*5113495bSYour Name 	}
1068*5113495bSYour Name 
1069*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1070*5113495bSYour Name }
1071*5113495bSYour Name 
1072*5113495bSYour Name /**
1073*5113495bSYour Name  * extract_peer_stats_tlv() - extract peer stats from event
1074*5113495bSYour Name  * @wmi_handle: wmi handle
1075*5113495bSYour Name  * @evt_buf: pointer to event buffer
1076*5113495bSYour Name  * @index: Index into peer stats
1077*5113495bSYour Name  * @peer_stats: Pointer to hold peer stats
1078*5113495bSYour Name  *
1079*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1080*5113495bSYour Name  */
1081*5113495bSYour Name static QDF_STATUS
extract_peer_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,uint32_t index,wmi_host_peer_stats * peer_stats)1082*5113495bSYour Name extract_peer_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index,
1083*5113495bSYour Name 		       wmi_host_peer_stats *peer_stats)
1084*5113495bSYour Name {
1085*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
1086*5113495bSYour Name 	wmi_stats_event_fixed_param *ev_param;
1087*5113495bSYour Name 	uint8_t *data;
1088*5113495bSYour Name 
1089*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *) evt_buf;
1090*5113495bSYour Name 	ev_param = (wmi_stats_event_fixed_param *) param_buf->fixed_param;
1091*5113495bSYour Name 	data = (uint8_t *) param_buf->data;
1092*5113495bSYour Name 
1093*5113495bSYour Name 	if (index < ev_param->num_peer_stats) {
1094*5113495bSYour Name 		wmi_peer_stats *ev = (wmi_peer_stats *) ((data) +
1095*5113495bSYour Name 			((ev_param->num_pdev_stats) * sizeof(wmi_pdev_stats)) +
1096*5113495bSYour Name 			((ev_param->num_vdev_stats) * sizeof(wmi_vdev_stats)) +
1097*5113495bSYour Name 			(index * sizeof(wmi_peer_stats)));
1098*5113495bSYour Name 
1099*5113495bSYour Name 		OS_MEMSET(peer_stats, 0, sizeof(wmi_host_peer_stats));
1100*5113495bSYour Name 
1101*5113495bSYour Name 		OS_MEMCPY(&(peer_stats->peer_macaddr),
1102*5113495bSYour Name 			&(ev->peer_macaddr), sizeof(wmi_mac_addr));
1103*5113495bSYour Name 
1104*5113495bSYour Name 		peer_stats->peer_rssi = ev->peer_rssi;
1105*5113495bSYour Name 		peer_stats->peer_tx_rate = ev->peer_tx_rate;
1106*5113495bSYour Name 		peer_stats->peer_rx_rate = ev->peer_rx_rate;
1107*5113495bSYour Name 	}
1108*5113495bSYour Name 
1109*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1110*5113495bSYour Name }
1111*5113495bSYour Name 
1112*5113495bSYour Name /**
1113*5113495bSYour Name  * extract_peer_extd_stats_tlv() - extract extended peer stats from event
1114*5113495bSYour Name  * @wmi_handle: wmi handle
1115*5113495bSYour Name  * @evt_buf: pointer to event buffer
1116*5113495bSYour Name  * @index: Index into extended peer stats
1117*5113495bSYour Name  * @peer_extd_stats: Pointer to hold extended peer stats
1118*5113495bSYour Name  *
1119*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1120*5113495bSYour Name  */
1121*5113495bSYour Name static QDF_STATUS
extract_peer_extd_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,uint32_t index,wmi_host_peer_extd_stats * peer_extd_stats)1122*5113495bSYour Name extract_peer_extd_stats_tlv(wmi_unified_t wmi_handle,
1123*5113495bSYour Name 			    void *evt_buf, uint32_t index,
1124*5113495bSYour Name 			    wmi_host_peer_extd_stats *peer_extd_stats)
1125*5113495bSYour Name {
1126*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
1127*5113495bSYour Name 	wmi_stats_event_fixed_param *ev_param;
1128*5113495bSYour Name 	uint8_t *data;
1129*5113495bSYour Name 
1130*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)evt_buf;
1131*5113495bSYour Name 	ev_param = (wmi_stats_event_fixed_param *)param_buf->fixed_param;
1132*5113495bSYour Name 	data = (uint8_t *)param_buf->data;
1133*5113495bSYour Name 	if (!data)
1134*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1135*5113495bSYour Name 
1136*5113495bSYour Name 	if (index < ev_param->num_peer_extd_stats) {
1137*5113495bSYour Name 		wmi_peer_extd_stats *ev = (wmi_peer_extd_stats *) (data +
1138*5113495bSYour Name 			(ev_param->num_pdev_stats * sizeof(wmi_pdev_stats)) +
1139*5113495bSYour Name 			(ev_param->num_vdev_stats * sizeof(wmi_vdev_stats)) +
1140*5113495bSYour Name 			(ev_param->num_peer_stats * sizeof(wmi_peer_stats)) +
1141*5113495bSYour Name 			(ev_param->num_bcnflt_stats *
1142*5113495bSYour Name 			sizeof(wmi_bcnfilter_stats_t)) +
1143*5113495bSYour Name 			(ev_param->num_chan_stats * sizeof(wmi_chan_stats)) +
1144*5113495bSYour Name 			(ev_param->num_mib_stats * sizeof(wmi_mib_stats)) +
1145*5113495bSYour Name 			(ev_param->num_bcn_stats * sizeof(wmi_bcn_stats)) +
1146*5113495bSYour Name 			(index * sizeof(wmi_peer_extd_stats)));
1147*5113495bSYour Name 
1148*5113495bSYour Name 		qdf_mem_zero(peer_extd_stats, sizeof(wmi_host_peer_extd_stats));
1149*5113495bSYour Name 		qdf_mem_copy(&peer_extd_stats->peer_macaddr, &ev->peer_macaddr,
1150*5113495bSYour Name 			     sizeof(wmi_mac_addr));
1151*5113495bSYour Name 
1152*5113495bSYour Name 		peer_extd_stats->rx_mc_bc_cnt = ev->rx_mc_bc_cnt;
1153*5113495bSYour Name 	}
1154*5113495bSYour Name 
1155*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1156*5113495bSYour Name 
1157*5113495bSYour Name }
1158*5113495bSYour Name 
1159*5113495bSYour Name /**
1160*5113495bSYour Name  * extract_pmf_bcn_protect_stats_tlv() - extract pmf bcn stats from event
1161*5113495bSYour Name  * @wmi_handle: wmi handle
1162*5113495bSYour Name  * @evt_buf: pointer to event buffer
1163*5113495bSYour Name  * @pmf_bcn_stats: Pointer to hold pmf bcn protect stats
1164*5113495bSYour Name  *
1165*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1166*5113495bSYour Name  */
1167*5113495bSYour Name 
1168*5113495bSYour Name static QDF_STATUS
extract_pmf_bcn_protect_stats_tlv(wmi_unified_t wmi_handle,void * evt_buf,wmi_host_pmf_bcn_protect_stats * pmf_bcn_stats)1169*5113495bSYour Name extract_pmf_bcn_protect_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
1170*5113495bSYour Name 				  wmi_host_pmf_bcn_protect_stats *pmf_bcn_stats)
1171*5113495bSYour Name {
1172*5113495bSYour Name 	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
1173*5113495bSYour Name 	wmi_stats_event_fixed_param *ev_param;
1174*5113495bSYour Name 
1175*5113495bSYour Name 	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)evt_buf;
1176*5113495bSYour Name 	if (!param_buf)
1177*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1178*5113495bSYour Name 
1179*5113495bSYour Name 	ev_param = (wmi_stats_event_fixed_param *)param_buf->fixed_param;
1180*5113495bSYour Name 
1181*5113495bSYour Name 	if ((ev_param->stats_id & WMI_REQUEST_PMF_BCN_PROTECT_STAT) &&
1182*5113495bSYour Name 	    param_buf->pmf_bcn_protect_stats) {
1183*5113495bSYour Name 		pmf_bcn_stats->igtk_mic_fail_cnt =
1184*5113495bSYour Name 			param_buf->pmf_bcn_protect_stats->igtk_mic_fail_cnt;
1185*5113495bSYour Name 		pmf_bcn_stats->igtk_replay_cnt =
1186*5113495bSYour Name 			param_buf->pmf_bcn_protect_stats->igtk_replay_cnt;
1187*5113495bSYour Name 		pmf_bcn_stats->bcn_mic_fail_cnt =
1188*5113495bSYour Name 			param_buf->pmf_bcn_protect_stats->bcn_mic_fail_cnt;
1189*5113495bSYour Name 		pmf_bcn_stats->bcn_replay_cnt =
1190*5113495bSYour Name 			param_buf->pmf_bcn_protect_stats->bcn_replay_cnt;
1191*5113495bSYour Name 	}
1192*5113495bSYour Name 
1193*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1194*5113495bSYour Name }
1195*5113495bSYour Name 
1196*5113495bSYour Name #if defined(WLAN_SUPPORT_INFRA_CTRL_PATH_STATS) || \
1197*5113495bSYour Name 	defined(WLAN_CONFIG_TELEMETRY_AGENT)
wmi_infra_cp_stats_ops_attach_tlv(struct wmi_ops * ops)1198*5113495bSYour Name static void wmi_infra_cp_stats_ops_attach_tlv(struct wmi_ops *ops)
1199*5113495bSYour Name {
1200*5113495bSYour Name 	ops->send_infra_cp_stats_request_cmd =
1201*5113495bSYour Name 					send_infra_cp_stats_request_cmd_tlv;
1202*5113495bSYour Name }
1203*5113495bSYour Name #else
wmi_infra_cp_stats_ops_attach_tlv(struct wmi_ops * ops)1204*5113495bSYour Name static void wmi_infra_cp_stats_ops_attach_tlv(struct wmi_ops *ops)
1205*5113495bSYour Name {
1206*5113495bSYour Name }
1207*5113495bSYour Name #endif /* WLAN_SUPPORT_INFRA_CTRL_PATH_STATS */
1208*5113495bSYour Name 
1209*5113495bSYour Name #ifdef WLAN_FEATURE_SON
1210*5113495bSYour Name /**
1211*5113495bSYour Name  * extract_inst_rssi_stats_resp_tlv() - extract inst rssi stats from event
1212*5113495bSYour Name  * @wmi_handle: wmi handle
1213*5113495bSYour Name  * @evt_buf: pointer to event buffer
1214*5113495bSYour Name  * @inst_rssi_resp: Pointer to hold inst rssi response
1215*5113495bSYour Name  *
1216*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1217*5113495bSYour Name  */
1218*5113495bSYour Name static QDF_STATUS
extract_inst_rssi_stats_resp_tlv(wmi_unified_t wmi_handle,void * evt_buf,struct wmi_host_inst_rssi_stats_resp * inst_rssi_resp)1219*5113495bSYour Name extract_inst_rssi_stats_resp_tlv(wmi_unified_t wmi_handle, void *evt_buf,
1220*5113495bSYour Name 			struct wmi_host_inst_rssi_stats_resp *inst_rssi_resp)
1221*5113495bSYour Name {
1222*5113495bSYour Name 	WMI_INST_RSSI_STATS_EVENTID_param_tlvs *param_buf;
1223*5113495bSYour Name 	wmi_inst_rssi_stats_resp_fixed_param *event;
1224*5113495bSYour Name 
1225*5113495bSYour Name 	param_buf = (WMI_INST_RSSI_STATS_EVENTID_param_tlvs *)evt_buf;
1226*5113495bSYour Name 	event = (wmi_inst_rssi_stats_resp_fixed_param *)param_buf->fixed_param;
1227*5113495bSYour Name 
1228*5113495bSYour Name 	inst_rssi_resp->inst_rssi = event->iRSSI;
1229*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(inst_rssi_resp->peer_macaddr.bytes,
1230*5113495bSYour Name 				   &event->peer_macaddr);
1231*5113495bSYour Name 	inst_rssi_resp->vdev_id = event->vdev_id;
1232*5113495bSYour Name 
1233*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1234*5113495bSYour Name }
1235*5113495bSYour Name 
1236*5113495bSYour Name static void
wmi_inst_rssi_stats_ops_attach_tlv(struct wmi_ops * ops)1237*5113495bSYour Name wmi_inst_rssi_stats_ops_attach_tlv(struct wmi_ops *ops)
1238*5113495bSYour Name {
1239*5113495bSYour Name 	ops->extract_inst_rssi_stats_resp = extract_inst_rssi_stats_resp_tlv;
1240*5113495bSYour Name }
1241*5113495bSYour Name #else
1242*5113495bSYour Name static void
wmi_inst_rssi_stats_ops_attach_tlv(struct wmi_ops * ops)1243*5113495bSYour Name wmi_inst_rssi_stats_ops_attach_tlv(struct wmi_ops *ops)
1244*5113495bSYour Name {
1245*5113495bSYour Name }
1246*5113495bSYour Name #endif
1247*5113495bSYour Name 
wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)1248*5113495bSYour Name void wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)
1249*5113495bSYour Name {
1250*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
1251*5113495bSYour Name 
1252*5113495bSYour Name 	ops->send_stats_request_cmd = send_stats_request_cmd_tlv;
1253*5113495bSYour Name #ifdef WLAN_FEATURE_BIG_DATA_STATS
1254*5113495bSYour Name 	ops->send_big_data_stats_request_cmd =
1255*5113495bSYour Name 				send_big_data_stats_request_cmd_tlv;
1256*5113495bSYour Name #endif
1257*5113495bSYour Name 	ops->extract_all_stats_count = extract_all_stats_counts_tlv;
1258*5113495bSYour Name 	ops->extract_pdev_stats = extract_pdev_stats_tlv;
1259*5113495bSYour Name 	ops->extract_vdev_stats = extract_vdev_stats_tlv;
1260*5113495bSYour Name 	ops->extract_peer_stats = extract_peer_stats_tlv;
1261*5113495bSYour Name 	ops->extract_peer_extd_stats = extract_peer_extd_stats_tlv;
1262*5113495bSYour Name 	wmi_infra_cp_stats_ops_attach_tlv(ops);
1263*5113495bSYour Name 	ops->extract_pmf_bcn_protect_stats = extract_pmf_bcn_protect_stats_tlv,
1264*5113495bSYour Name 	wmi_inst_rssi_stats_ops_attach_tlv(ops);
1265*5113495bSYour Name 
1266*5113495bSYour Name 	wmi_mc_cp_stats_attach_tlv(wmi_handle);
1267*5113495bSYour Name }
1268