xref: /wlan-driver/qca-wifi-host-cmn/ipa/core/src/wlan_ipa_stats.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-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
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /* Include Files */
21*5113495bSYour Name #include "wlan_ipa_main.h"
22*5113495bSYour Name #include "wlan_ipa_core.h"
23*5113495bSYour Name #include "cdp_txrx_ipa.h"
24*5113495bSYour Name #include "qdf_platform.h"
25*5113495bSYour Name 
26*5113495bSYour Name /**
27*5113495bSYour Name  * wlan_ipa_uc_rt_debug_host_fill - fill rt debug buffer
28*5113495bSYour Name  * @ctext: pointer to ipa context.
29*5113495bSYour Name  *
30*5113495bSYour Name  * If rt debug enabled, periodically called, and fill debug buffer
31*5113495bSYour Name  *
32*5113495bSYour Name  * Return: none
33*5113495bSYour Name  */
wlan_ipa_uc_rt_debug_host_fill(void * ctext)34*5113495bSYour Name static void wlan_ipa_uc_rt_debug_host_fill(void *ctext)
35*5113495bSYour Name {
36*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx = ctext;
37*5113495bSYour Name 	struct uc_rt_debug_info *dump_info = NULL;
38*5113495bSYour Name 
39*5113495bSYour Name 	if (!ipa_ctx)
40*5113495bSYour Name 		return;
41*5113495bSYour Name 
42*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->rt_debug_lock);
43*5113495bSYour Name 	dump_info = &ipa_ctx->rt_bug_buffer[
44*5113495bSYour Name 		ipa_ctx->rt_buf_fill_index % WLAN_IPA_UC_RT_DEBUG_BUF_COUNT];
45*5113495bSYour Name 
46*5113495bSYour Name 	dump_info->time = (uint64_t)qdf_mc_timer_get_system_time();
47*5113495bSYour Name 	dump_info->ipa_excep_count = ipa_ctx->stats.num_rx_excep;
48*5113495bSYour Name 	dump_info->rx_drop_count = ipa_ctx->ipa_rx_internal_drop_count;
49*5113495bSYour Name 	dump_info->net_sent_count = ipa_ctx->ipa_rx_net_send_count;
50*5113495bSYour Name 	dump_info->tx_fwd_count = ipa_ctx->ipa_tx_forward;
51*5113495bSYour Name 	dump_info->tx_fwd_ok_count = ipa_ctx->stats.num_tx_fwd_ok;
52*5113495bSYour Name 	dump_info->rx_discard_count = ipa_ctx->ipa_rx_discard;
53*5113495bSYour Name 	dump_info->rx_destructor_call = ipa_ctx->ipa_rx_destructor_count;
54*5113495bSYour Name 	ipa_ctx->rt_buf_fill_index++;
55*5113495bSYour Name 	qdf_mutex_release(&ipa_ctx->rt_debug_lock);
56*5113495bSYour Name 
57*5113495bSYour Name 	qdf_mc_timer_start(&ipa_ctx->rt_debug_fill_timer,
58*5113495bSYour Name 		WLAN_IPA_UC_RT_DEBUG_FILL_INTERVAL);
59*5113495bSYour Name }
60*5113495bSYour Name 
wlan_ipa_uc_rt_debug_host_dump(struct wlan_ipa_priv * ipa_ctx)61*5113495bSYour Name void wlan_ipa_uc_rt_debug_host_dump(struct wlan_ipa_priv *ipa_ctx)
62*5113495bSYour Name {
63*5113495bSYour Name 	unsigned int dump_count;
64*5113495bSYour Name 	unsigned int dump_index;
65*5113495bSYour Name 	struct uc_rt_debug_info *dump_info = NULL;
66*5113495bSYour Name 
67*5113495bSYour Name 	if (!wlan_ipa_is_rt_debugging_enabled(ipa_ctx->config)) {
68*5113495bSYour Name 		ipa_debug("IPA RT debug is not enabled");
69*5113495bSYour Name 		return;
70*5113495bSYour Name 	}
71*5113495bSYour Name 
72*5113495bSYour Name 	ipa_info("========= WLAN-IPA DEBUG BUF DUMP ==========\n");
73*5113495bSYour Name 	ipa_info("     TM     :   EXEP   :   DROP   :   NETS   :   FWOK"
74*5113495bSYour Name 		 ":   TXFD   :   DSTR   :   DSCD\n");
75*5113495bSYour Name 
76*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->rt_debug_lock);
77*5113495bSYour Name 	for (dump_count = 0;
78*5113495bSYour Name 		dump_count < WLAN_IPA_UC_RT_DEBUG_BUF_COUNT;
79*5113495bSYour Name 		dump_count++) {
80*5113495bSYour Name 		dump_index = (ipa_ctx->rt_buf_fill_index + dump_count) %
81*5113495bSYour Name 			WLAN_IPA_UC_RT_DEBUG_BUF_COUNT;
82*5113495bSYour Name 		dump_info = &ipa_ctx->rt_bug_buffer[dump_index];
83*5113495bSYour Name 		ipa_info("%12llu:%10llu:%10llu:%10llu:%10llu:%10llu:%10llu:%10llu\n",
84*5113495bSYour Name 			dump_info->time, dump_info->ipa_excep_count,
85*5113495bSYour Name 			dump_info->rx_drop_count, dump_info->net_sent_count,
86*5113495bSYour Name 			dump_info->tx_fwd_ok_count, dump_info->tx_fwd_count,
87*5113495bSYour Name 			dump_info->rx_destructor_call,
88*5113495bSYour Name 			dump_info->rx_discard_count);
89*5113495bSYour Name 	}
90*5113495bSYour Name 	qdf_mutex_release(&ipa_ctx->rt_debug_lock);
91*5113495bSYour Name }
92*5113495bSYour Name 
93*5113495bSYour Name /**
94*5113495bSYour Name  * wlan_ipa_uc_rt_debug_handler - periodic memory health monitor handler
95*5113495bSYour Name  * @ctext: pointer to ipa context.
96*5113495bSYour Name  *
97*5113495bSYour Name  * periodically called by timer expire
98*5113495bSYour Name  * will try to alloc dummy memory and detect out of memory condition
99*5113495bSYour Name  * if out of memory detected, dump wlan-ipa stats
100*5113495bSYour Name  *
101*5113495bSYour Name  * Return: none
102*5113495bSYour Name  */
wlan_ipa_uc_rt_debug_handler(void * ctext)103*5113495bSYour Name static void wlan_ipa_uc_rt_debug_handler(void *ctext)
104*5113495bSYour Name {
105*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx = ctext;
106*5113495bSYour Name 	void *dummy_ptr = NULL;
107*5113495bSYour Name 
108*5113495bSYour Name 	if (!wlan_ipa_is_rt_debugging_enabled(ipa_ctx->config)) {
109*5113495bSYour Name 		ipa_debug("IPA RT debug is not enabled");
110*5113495bSYour Name 		return;
111*5113495bSYour Name 	}
112*5113495bSYour Name 
113*5113495bSYour Name 	/* Allocate dummy buffer periodically and free immediately. this will
114*5113495bSYour Name 	 * proactively detect OOM and if allocation fails dump ipa stats
115*5113495bSYour Name 	 */
116*5113495bSYour Name 	dummy_ptr = qdf_mem_malloc(WLAN_IPA_UC_DEBUG_DUMMY_MEM_SIZE);
117*5113495bSYour Name 	if (!dummy_ptr) {
118*5113495bSYour Name 		wlan_ipa_uc_rt_debug_host_dump(ipa_ctx);
119*5113495bSYour Name 		wlan_ipa_uc_stat_request(ipa_ctx,
120*5113495bSYour Name 					 WLAN_IPA_UC_STAT_REASON_DEBUG);
121*5113495bSYour Name 	} else {
122*5113495bSYour Name 		qdf_mem_free(dummy_ptr);
123*5113495bSYour Name 	}
124*5113495bSYour Name 
125*5113495bSYour Name 	qdf_mc_timer_start(&ipa_ctx->rt_debug_timer,
126*5113495bSYour Name 		WLAN_IPA_UC_RT_DEBUG_PERIOD);
127*5113495bSYour Name }
128*5113495bSYour Name 
wlan_ipa_uc_rt_debug_destructor(qdf_nbuf_t nbuff)129*5113495bSYour Name void wlan_ipa_uc_rt_debug_destructor(qdf_nbuf_t nbuff)
130*5113495bSYour Name {
131*5113495bSYour Name 	/* Make change to get the ipa_ctx on per pdev basis
132*5113495bSYour Name 	 * Currently storing the debug count only in global ipa_ctx
133*5113495bSYour Name 	 * or to the last enumerated radio ipa_ctx
134*5113495bSYour Name 	 */
135*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx = wlan_ipa_get_obj_context();
136*5113495bSYour Name 
137*5113495bSYour Name 	if (!ipa_ctx) {
138*5113495bSYour Name 		ipa_err("invalid ipa context");
139*5113495bSYour Name 		return;
140*5113495bSYour Name 	}
141*5113495bSYour Name 
142*5113495bSYour Name 	ipa_ctx->ipa_rx_destructor_count++;
143*5113495bSYour Name }
144*5113495bSYour Name 
wlan_ipa_uc_rt_debug_deinit(struct wlan_ipa_priv * ipa_ctx)145*5113495bSYour Name void wlan_ipa_uc_rt_debug_deinit(struct wlan_ipa_priv *ipa_ctx)
146*5113495bSYour Name {
147*5113495bSYour Name 	qdf_mutex_destroy(&ipa_ctx->rt_debug_lock);
148*5113495bSYour Name 
149*5113495bSYour Name 	if (!wlan_ipa_is_rt_debugging_enabled(ipa_ctx->config)) {
150*5113495bSYour Name 		ipa_debug("IPA RT debug is not enabled");
151*5113495bSYour Name 		return;
152*5113495bSYour Name 	}
153*5113495bSYour Name 
154*5113495bSYour Name 	if (QDF_TIMER_STATE_STOPPED !=
155*5113495bSYour Name 		qdf_mc_timer_get_current_state(&ipa_ctx->rt_debug_fill_timer)) {
156*5113495bSYour Name 		qdf_mc_timer_stop(&ipa_ctx->rt_debug_fill_timer);
157*5113495bSYour Name 	}
158*5113495bSYour Name 	qdf_mc_timer_destroy(&ipa_ctx->rt_debug_fill_timer);
159*5113495bSYour Name 
160*5113495bSYour Name 	if (QDF_TIMER_STATE_STOPPED !=
161*5113495bSYour Name 		qdf_mc_timer_get_current_state(&ipa_ctx->rt_debug_timer)) {
162*5113495bSYour Name 		qdf_mc_timer_stop(&ipa_ctx->rt_debug_timer);
163*5113495bSYour Name 	}
164*5113495bSYour Name 	qdf_mc_timer_destroy(&ipa_ctx->rt_debug_timer);
165*5113495bSYour Name }
166*5113495bSYour Name 
wlan_ipa_uc_rt_debug_init(struct wlan_ipa_priv * ipa_ctx)167*5113495bSYour Name void wlan_ipa_uc_rt_debug_init(struct wlan_ipa_priv *ipa_ctx)
168*5113495bSYour Name {
169*5113495bSYour Name 	qdf_mutex_create(&ipa_ctx->rt_debug_lock);
170*5113495bSYour Name 	ipa_ctx->rt_buf_fill_index = 0;
171*5113495bSYour Name 	qdf_mem_zero(ipa_ctx->rt_bug_buffer,
172*5113495bSYour Name 		sizeof(struct uc_rt_debug_info) *
173*5113495bSYour Name 		WLAN_IPA_UC_RT_DEBUG_BUF_COUNT);
174*5113495bSYour Name 	ipa_ctx->ipa_tx_forward = 0;
175*5113495bSYour Name 	ipa_ctx->ipa_rx_discard = 0;
176*5113495bSYour Name 	ipa_ctx->ipa_rx_net_send_count = 0;
177*5113495bSYour Name 	ipa_ctx->ipa_rx_internal_drop_count = 0;
178*5113495bSYour Name 	ipa_ctx->ipa_rx_destructor_count = 0;
179*5113495bSYour Name 
180*5113495bSYour Name 	/* Realtime debug enable on feature enable */
181*5113495bSYour Name 	if (!wlan_ipa_is_rt_debugging_enabled(ipa_ctx->config)) {
182*5113495bSYour Name 		ipa_debug("IPA RT debug is not enabled");
183*5113495bSYour Name 		return;
184*5113495bSYour Name 	}
185*5113495bSYour Name 
186*5113495bSYour Name 	qdf_mc_timer_init(&ipa_ctx->rt_debug_fill_timer, QDF_TIMER_TYPE_SW,
187*5113495bSYour Name 		wlan_ipa_uc_rt_debug_host_fill, (void *)ipa_ctx);
188*5113495bSYour Name 	qdf_mc_timer_start(&ipa_ctx->rt_debug_fill_timer,
189*5113495bSYour Name 		WLAN_IPA_UC_RT_DEBUG_FILL_INTERVAL);
190*5113495bSYour Name 
191*5113495bSYour Name 	qdf_mc_timer_init(&ipa_ctx->rt_debug_timer, QDF_TIMER_TYPE_SW,
192*5113495bSYour Name 		wlan_ipa_uc_rt_debug_handler, (void *)ipa_ctx);
193*5113495bSYour Name 	qdf_mc_timer_start(&ipa_ctx->rt_debug_timer,
194*5113495bSYour Name 		WLAN_IPA_UC_RT_DEBUG_PERIOD);
195*5113495bSYour Name 
196*5113495bSYour Name }
197*5113495bSYour Name 
198*5113495bSYour Name /**
199*5113495bSYour Name  * wlan_ipa_dump_ipa_ctx() - Dump entries in IPA private context structure
200*5113495bSYour Name  * @ipa_ctx: IPA private context structure
201*5113495bSYour Name  *
202*5113495bSYour Name  * Dump entries in struct ipa_ctx
203*5113495bSYour Name  *
204*5113495bSYour Name  * Return: none
205*5113495bSYour Name  */
wlan_ipa_dump_ipa_ctx(struct wlan_ipa_priv * ipa_ctx)206*5113495bSYour Name static void wlan_ipa_dump_ipa_ctx(struct wlan_ipa_priv *ipa_ctx)
207*5113495bSYour Name {
208*5113495bSYour Name 	int i;
209*5113495bSYour Name 
210*5113495bSYour Name 	/* IPA IPA */
211*5113495bSYour Name 	ipa_info("\n==== IPA IPA ====\n"
212*5113495bSYour Name 		"num_iface: %d\n"
213*5113495bSYour Name 		"rm_state: %d\n"
214*5113495bSYour Name 		"rm_lock: %pK\n"
215*5113495bSYour Name 		"uc_rm_work: %pK\n"
216*5113495bSYour Name 		"uc_op_work: %pK\n"
217*5113495bSYour Name 		"wake_lock: %pK\n"
218*5113495bSYour Name 		"wake_lock_work: %pK\n"
219*5113495bSYour Name 		"wake_lock_released: %d\n"
220*5113495bSYour Name 		"tx_ref_cnt: %d\n"
221*5113495bSYour Name 		"pm_queue_head----\n"
222*5113495bSYour Name 		"\thead: %pK\n"
223*5113495bSYour Name 		"\ttail: %pK\n"
224*5113495bSYour Name 		"\tqlen: %d\n"
225*5113495bSYour Name 		"pm_work: %pK\n"
226*5113495bSYour Name 		"pm_lock: %pK\n"
227*5113495bSYour Name 		"suspended: %d\n",
228*5113495bSYour Name 		ipa_ctx->num_iface,
229*5113495bSYour Name 		ipa_ctx->rm_state,
230*5113495bSYour Name 		&ipa_ctx->rm_lock,
231*5113495bSYour Name 		&ipa_ctx->uc_rm_work,
232*5113495bSYour Name 		&ipa_ctx->uc_op_work,
233*5113495bSYour Name 		&ipa_ctx->wake_lock,
234*5113495bSYour Name 		&ipa_ctx->wake_lock_work,
235*5113495bSYour Name 		ipa_ctx->wake_lock_released,
236*5113495bSYour Name 		ipa_ctx->tx_ref_cnt.counter,
237*5113495bSYour Name 		ipa_ctx->pm_queue_head.head,
238*5113495bSYour Name 		ipa_ctx->pm_queue_head.tail,
239*5113495bSYour Name 		ipa_ctx->pm_queue_head.qlen,
240*5113495bSYour Name 		&ipa_ctx->pm_work,
241*5113495bSYour Name 		&ipa_ctx->pm_lock,
242*5113495bSYour Name 		ipa_ctx->suspended);
243*5113495bSYour Name 
244*5113495bSYour Name 	ipa_info("\nq_lock: %pK\n"
245*5113495bSYour Name 		"pend_desc_head----\n"
246*5113495bSYour Name 		"\tnext: %pK\n"
247*5113495bSYour Name 		"\tprev: %pK\n"
248*5113495bSYour Name 		"stats: %pK\n"
249*5113495bSYour Name 		"curr_prod_bw: %d\n"
250*5113495bSYour Name 		"curr_cons_bw: %d\n"
251*5113495bSYour Name 		"activated_fw_pipe: %d\n"
252*5113495bSYour Name 		"sap_num_connected_sta: %d\n"
253*5113495bSYour Name 		"sta_connected: %d\n",
254*5113495bSYour Name 		&ipa_ctx->q_lock,
255*5113495bSYour Name 		ipa_ctx->pend_desc_head.next,
256*5113495bSYour Name 		ipa_ctx->pend_desc_head.prev,
257*5113495bSYour Name 		&ipa_ctx->stats,
258*5113495bSYour Name 		ipa_ctx->curr_prod_bw,
259*5113495bSYour Name 		ipa_ctx->curr_cons_bw,
260*5113495bSYour Name 		ipa_ctx->activated_fw_pipe,
261*5113495bSYour Name 		ipa_ctx->sap_num_connected_sta,
262*5113495bSYour Name 		(unsigned int)ipa_ctx->sta_connected);
263*5113495bSYour Name 
264*5113495bSYour Name 	ipa_info("\ntx_pipe_handle: 0x%x\n"
265*5113495bSYour Name 		"rx_pipe_handle: 0x%x\n"
266*5113495bSYour Name 		"resource_loading: %d\n"
267*5113495bSYour Name 		"resource_unloading: %d\n"
268*5113495bSYour Name 		"pending_cons_req: %d\n"
269*5113495bSYour Name 		"pending_event----\n"
270*5113495bSYour Name 		"\tanchor.next: %pK\n"
271*5113495bSYour Name 		"\tanchor.prev: %pK\n"
272*5113495bSYour Name 		"\tcount: %d\n"
273*5113495bSYour Name 		"\tmax_size: %d\n"
274*5113495bSYour Name 		"event_lock: %pK\n"
275*5113495bSYour Name 		"ipa_tx_packets_diff: %d\n"
276*5113495bSYour Name 		"ipa_rx_packets_diff: %d\n"
277*5113495bSYour Name 		"ipa_p_tx_packets: %d\n"
278*5113495bSYour Name 		"ipa_p_rx_packets: %d\n"
279*5113495bSYour Name 		"stat_req_reason: %d\n",
280*5113495bSYour Name 		ipa_ctx->tx_pipe_handle,
281*5113495bSYour Name 		ipa_ctx->rx_pipe_handle,
282*5113495bSYour Name 		ipa_ctx->resource_loading,
283*5113495bSYour Name 		ipa_ctx->resource_unloading,
284*5113495bSYour Name 		ipa_ctx->pending_cons_req,
285*5113495bSYour Name 		ipa_ctx->pending_event.anchor.next,
286*5113495bSYour Name 		ipa_ctx->pending_event.anchor.prev,
287*5113495bSYour Name 		ipa_ctx->pending_event.count,
288*5113495bSYour Name 		ipa_ctx->pending_event.max_size,
289*5113495bSYour Name 		&ipa_ctx->event_lock,
290*5113495bSYour Name 		ipa_ctx->ipa_tx_packets_diff,
291*5113495bSYour Name 		ipa_ctx->ipa_rx_packets_diff,
292*5113495bSYour Name 		ipa_ctx->ipa_p_tx_packets,
293*5113495bSYour Name 		ipa_ctx->ipa_p_rx_packets,
294*5113495bSYour Name 		ipa_ctx->stat_req_reason);
295*5113495bSYour Name 
296*5113495bSYour Name 	ipa_info("\ncons_pipe_in----\n"
297*5113495bSYour Name 		"\tsys: %pK\n"
298*5113495bSYour Name 		"\tdl.comp_ring_base_pa: 0x%x\n"
299*5113495bSYour Name 		"\tdl.comp_ring_size: %d\n"
300*5113495bSYour Name 		"\tdl.ce_ring_base_pa: 0x%x\n"
301*5113495bSYour Name 		"\tdl.ce_door_bell_pa: 0x%x\n"
302*5113495bSYour Name 		"\tdl.ce_ring_size: %d\n"
303*5113495bSYour Name 		"\tdl.num_tx_buffers: %d\n"
304*5113495bSYour Name 		"prod_pipe_in----\n"
305*5113495bSYour Name 		"\tsys: %pK\n"
306*5113495bSYour Name 		"\tul.rdy_ring_base_pa: 0x%x\n"
307*5113495bSYour Name 		"\tul.rdy_ring_size: %d\n"
308*5113495bSYour Name 		"\tul.rdy_ring_rp_pa: 0x%x\n"
309*5113495bSYour Name 		"uc_loaded: %d\n"
310*5113495bSYour Name 		"wdi_enabled: %d\n"
311*5113495bSYour Name 		"rt_debug_fill_timer: %pK\n"
312*5113495bSYour Name 		"rt_debug_lock: %pK\n"
313*5113495bSYour Name 		"ipa_lock: %pK\n",
314*5113495bSYour Name 		&ipa_ctx->cons_pipe_in.sys,
315*5113495bSYour Name 		(unsigned int)ipa_ctx->cons_pipe_in.u.dl.comp_ring_base_pa,
316*5113495bSYour Name 		ipa_ctx->cons_pipe_in.u.dl.comp_ring_size,
317*5113495bSYour Name 		(unsigned int)ipa_ctx->cons_pipe_in.u.dl.ce_ring_base_pa,
318*5113495bSYour Name 		(unsigned int)ipa_ctx->cons_pipe_in.u.dl.ce_door_bell_pa,
319*5113495bSYour Name 		ipa_ctx->cons_pipe_in.u.dl.ce_ring_size,
320*5113495bSYour Name 		ipa_ctx->cons_pipe_in.u.dl.num_tx_buffers,
321*5113495bSYour Name 		&ipa_ctx->prod_pipe_in.sys,
322*5113495bSYour Name 		(unsigned int)ipa_ctx->prod_pipe_in.u.ul.rdy_ring_base_pa,
323*5113495bSYour Name 		ipa_ctx->prod_pipe_in.u.ul.rdy_ring_size,
324*5113495bSYour Name 		(unsigned int)ipa_ctx->prod_pipe_in.u.ul.rdy_ring_rp_pa,
325*5113495bSYour Name 		ipa_ctx->uc_loaded,
326*5113495bSYour Name 		ipa_ctx->wdi_enabled,
327*5113495bSYour Name 		&ipa_ctx->rt_debug_fill_timer,
328*5113495bSYour Name 		&ipa_ctx->rt_debug_lock,
329*5113495bSYour Name 		&ipa_ctx->ipa_lock);
330*5113495bSYour Name 
331*5113495bSYour Name 	ipa_info("\nvdev_to_iface----");
332*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_SESSION; i++)
333*5113495bSYour Name 		ipa_info("\n\t[%d]=%d", i, ipa_ctx->vdev_to_iface[i]);
334*5113495bSYour Name 
335*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_IPA, QDF_TRACE_LEVEL_INFO,
336*5113495bSYour Name 		"\nvdev_offload_enabled----");
337*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_SESSION; i++)
338*5113495bSYour Name 		ipa_info("\n\t[%d]=%d", i, ipa_ctx->vdev_offload_enabled[i]);
339*5113495bSYour Name 
340*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_IPA, QDF_TRACE_LEVEL_INFO,
341*5113495bSYour Name 		"\nassoc_stas_map ----");
342*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_STA_COUNT; i++) {
343*5113495bSYour Name 		ipa_info("\n\t[%d]: is_reserved=%d mac: " QDF_MAC_ADDR_FMT, i,
344*5113495bSYour Name 			 ipa_ctx->assoc_stas_map[i].is_reserved,
345*5113495bSYour Name 			 QDF_MAC_ADDR_REF(
346*5113495bSYour Name 				ipa_ctx->assoc_stas_map[i].mac_addr.bytes));
347*5113495bSYour Name 	}
348*5113495bSYour Name }
349*5113495bSYour Name 
350*5113495bSYour Name /**
351*5113495bSYour Name  * wlan_ipa_dump_sys_pipe() - Dump IPA system pipe
352*5113495bSYour Name  * @ipa_ctx: IPA private context structure
353*5113495bSYour Name  *
354*5113495bSYour Name  * Dump entire struct wlan_ipa_sys_pipe
355*5113495bSYour Name  *
356*5113495bSYour Name  * Return: none
357*5113495bSYour Name  */
wlan_ipa_dump_sys_pipe(struct wlan_ipa_priv * ipa_ctx)358*5113495bSYour Name static void wlan_ipa_dump_sys_pipe(struct wlan_ipa_priv *ipa_ctx)
359*5113495bSYour Name {
360*5113495bSYour Name 	int i;
361*5113495bSYour Name 
362*5113495bSYour Name 	/* IPA SYS Pipes */
363*5113495bSYour Name 	ipa_info("==== IPA SYS Pipes ====");
364*5113495bSYour Name 
365*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_SYSBAM_PIPE; i++) {
366*5113495bSYour Name 		struct wlan_ipa_sys_pipe *sys_pipe;
367*5113495bSYour Name 		qdf_ipa_sys_connect_params_t *ipa_sys_params;
368*5113495bSYour Name 
369*5113495bSYour Name 		sys_pipe = &ipa_ctx->sys_pipe[i];
370*5113495bSYour Name 		ipa_sys_params = &sys_pipe->ipa_sys_params;
371*5113495bSYour Name 
372*5113495bSYour Name 		ipa_info("\nsys_pipe[%d]----\n"
373*5113495bSYour Name 			"\tconn_hdl: 0x%x\n"
374*5113495bSYour Name 			"\tconn_hdl_valid: %d\n"
375*5113495bSYour Name 			"\tnat_en: %d\n"
376*5113495bSYour Name 			"\thdr_len %d\n"
377*5113495bSYour Name 			"\thdr_additional_const_len: %d\n"
378*5113495bSYour Name 			"\thdr_ofst_pkt_size_valid: %d\n"
379*5113495bSYour Name 			"\thdr_ofst_pkt_size: %d\n"
380*5113495bSYour Name 			"\thdr_little_endian: %d\n"
381*5113495bSYour Name 			"\tmode: %d\n"
382*5113495bSYour Name 			"\tclient: %d\n"
383*5113495bSYour Name 			"\tdesc_fifo_sz: %d\n"
384*5113495bSYour Name 			"\tpriv: %pK\n"
385*5113495bSYour Name 			"\tnotify: %pK\n"
386*5113495bSYour Name 			"\tskip_ep_cfg: %d\n"
387*5113495bSYour Name 			"\tkeep_ipa_awake: %d\n",
388*5113495bSYour Name 			i,
389*5113495bSYour Name 			sys_pipe->conn_hdl,
390*5113495bSYour Name 			sys_pipe->conn_hdl_valid,
391*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_NAT_EN(ipa_sys_params),
392*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_HDR_LEN(ipa_sys_params),
393*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_HDR_ADDITIONAL_CONST_LEN(
394*5113495bSYour Name 				ipa_sys_params),
395*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_HDR_OFST_PKT_SIZE_VALID(
396*5113495bSYour Name 				ipa_sys_params),
397*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_HDR_OFST_PKT_SIZE(ipa_sys_params),
398*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_HDR_LITTLE_ENDIAN(ipa_sys_params),
399*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_MODE(ipa_sys_params),
400*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_CLIENT(ipa_sys_params),
401*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_DESC_FIFO_SZ(ipa_sys_params),
402*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_PRIV(ipa_sys_params),
403*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_NOTIFY(ipa_sys_params),
404*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_SKIP_EP_CFG(ipa_sys_params),
405*5113495bSYour Name 			QDF_IPA_SYS_PARAMS_KEEP_IPA_AWAKE(ipa_sys_params));
406*5113495bSYour Name 	}
407*5113495bSYour Name }
408*5113495bSYour Name 
409*5113495bSYour Name #ifdef IPA_WDI3_TX_TWO_PIPES
410*5113495bSYour Name static void
wlan_ipa_dump_iface_context_alt_pipe(struct wlan_ipa_iface_context * iface)411*5113495bSYour Name wlan_ipa_dump_iface_context_alt_pipe(struct wlan_ipa_iface_context *iface)
412*5113495bSYour Name {
413*5113495bSYour Name 	ipa_info("\talt_pipe: %d\n", iface->alt_pipe);
414*5113495bSYour Name }
415*5113495bSYour Name #else
416*5113495bSYour Name static void
wlan_ipa_dump_iface_context_alt_pipe(struct wlan_ipa_iface_context * iface)417*5113495bSYour Name wlan_ipa_dump_iface_context_alt_pipe(struct wlan_ipa_iface_context *iface)
418*5113495bSYour Name {
419*5113495bSYour Name }
420*5113495bSYour Name #endif
421*5113495bSYour Name 
422*5113495bSYour Name /**
423*5113495bSYour Name  * wlan_ipa_dump_iface_context() - Dump IPA interface context structure
424*5113495bSYour Name  * @ipa_ctx: IPA private context structure
425*5113495bSYour Name  *
426*5113495bSYour Name  * Dump entire struct wlan_ipa_iface_context
427*5113495bSYour Name  *
428*5113495bSYour Name  * Return: none
429*5113495bSYour Name  */
wlan_ipa_dump_iface_context(struct wlan_ipa_priv * ipa_ctx)430*5113495bSYour Name static void wlan_ipa_dump_iface_context(struct wlan_ipa_priv *ipa_ctx)
431*5113495bSYour Name {
432*5113495bSYour Name 	int i;
433*5113495bSYour Name 
434*5113495bSYour Name 	/* IPA Interface Contexts */
435*5113495bSYour Name 	ipa_info("\n==== IPA Interface Contexts ====\n");
436*5113495bSYour Name 
437*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_IFACE; i++) {
438*5113495bSYour Name 		struct wlan_ipa_iface_context *iface_context;
439*5113495bSYour Name 
440*5113495bSYour Name 		iface_context = &ipa_ctx->iface_context[i];
441*5113495bSYour Name 
442*5113495bSYour Name 		ipa_info("\niface_context[%d]----\n"
443*5113495bSYour Name 			"\tipa_ctx: %pK\n"
444*5113495bSYour Name 			"\tsession_id: %d\n"
445*5113495bSYour Name 			"\tcons_client: %d\n"
446*5113495bSYour Name 			"\tprod_client: %d\n"
447*5113495bSYour Name 			"\tiface_id: %d\n"
448*5113495bSYour Name 			"\tinterface_lock: %pK\n"
449*5113495bSYour Name 			"\tifa_address: 0x%x\n",
450*5113495bSYour Name 			i,
451*5113495bSYour Name 			iface_context->ipa_ctx,
452*5113495bSYour Name 			iface_context->session_id,
453*5113495bSYour Name 			iface_context->cons_client,
454*5113495bSYour Name 			iface_context->prod_client,
455*5113495bSYour Name 			iface_context->iface_id,
456*5113495bSYour Name 			&iface_context->interface_lock,
457*5113495bSYour Name 			iface_context->ifa_address);
458*5113495bSYour Name 		wlan_ipa_dump_iface_context_alt_pipe(iface_context);
459*5113495bSYour Name 	}
460*5113495bSYour Name }
461*5113495bSYour Name 
wlan_ipa_dump_info(struct wlan_ipa_priv * ipa_ctx)462*5113495bSYour Name void wlan_ipa_dump_info(struct wlan_ipa_priv *ipa_ctx)
463*5113495bSYour Name {
464*5113495bSYour Name 	wlan_ipa_dump_ipa_ctx(ipa_ctx);
465*5113495bSYour Name 	wlan_ipa_dump_sys_pipe(ipa_ctx);
466*5113495bSYour Name 	wlan_ipa_dump_iface_context(ipa_ctx);
467*5113495bSYour Name }
468*5113495bSYour Name 
wlan_ipa_uc_stat_query(struct wlan_ipa_priv * ipa_ctx,uint32_t * ipa_tx_diff,uint32_t * ipa_rx_diff)469*5113495bSYour Name void wlan_ipa_uc_stat_query(struct wlan_ipa_priv *ipa_ctx,
470*5113495bSYour Name 			    uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff)
471*5113495bSYour Name {
472*5113495bSYour Name 	*ipa_tx_diff = 0;
473*5113495bSYour Name 	*ipa_rx_diff = 0;
474*5113495bSYour Name 
475*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->ipa_lock);
476*5113495bSYour Name 	if (wlan_ipa_is_fw_wdi_activated(ipa_ctx) &&
477*5113495bSYour Name 	    (false == ipa_ctx->resource_loading)) {
478*5113495bSYour Name 		*ipa_tx_diff = ipa_ctx->ipa_tx_packets_diff;
479*5113495bSYour Name 		*ipa_rx_diff = ipa_ctx->ipa_rx_packets_diff;
480*5113495bSYour Name 	}
481*5113495bSYour Name 	qdf_mutex_release(&ipa_ctx->ipa_lock);
482*5113495bSYour Name }
483*5113495bSYour Name 
wlan_ipa_uc_stat_request(struct wlan_ipa_priv * ipa_ctx,uint8_t reason)484*5113495bSYour Name void wlan_ipa_uc_stat_request(struct wlan_ipa_priv *ipa_ctx, uint8_t reason)
485*5113495bSYour Name {
486*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->ipa_lock);
487*5113495bSYour Name 	if (wlan_ipa_is_fw_wdi_activated(ipa_ctx) &&
488*5113495bSYour Name 	    (false == ipa_ctx->resource_loading)) {
489*5113495bSYour Name 		ipa_ctx->stat_req_reason = reason;
490*5113495bSYour Name 		cdp_ipa_get_stat(ipa_ctx->dp_soc, ipa_ctx->dp_pdev_id);
491*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
492*5113495bSYour Name 	} else {
493*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
494*5113495bSYour Name 	}
495*5113495bSYour Name }
496*5113495bSYour Name 
497*5113495bSYour Name /**
498*5113495bSYour Name  * wlan_ipa_print_session_info - Print IPA session info
499*5113495bSYour Name  * @ipa_ctx: IPA context
500*5113495bSYour Name  *
501*5113495bSYour Name  * Return: None
502*5113495bSYour Name  */
wlan_ipa_print_session_info(struct wlan_ipa_priv * ipa_ctx)503*5113495bSYour Name static void wlan_ipa_print_session_info(struct wlan_ipa_priv *ipa_ctx)
504*5113495bSYour Name {
505*5113495bSYour Name 	struct wlan_ipa_uc_pending_event *event = NULL, *next = NULL;
506*5113495bSYour Name 	struct wlan_ipa_iface_context *iface_context = NULL;
507*5113495bSYour Name 	int i;
508*5113495bSYour Name 
509*5113495bSYour Name 	ipa_info("\n==== IPA SESSION INFO ====\n"
510*5113495bSYour Name 		"NUM IFACE: %d\n"
511*5113495bSYour Name 		"RM STATE: %d\n"
512*5113495bSYour Name 		"ACTIVATED FW PIPE: %d\n"
513*5113495bSYour Name 		"SAP NUM STAs: %d\n"
514*5113495bSYour Name 		"STA CONNECTED: %d\n"
515*5113495bSYour Name 		"CONCURRENT MODE: %s\n"
516*5113495bSYour Name 		"RSC LOADING: %d\n"
517*5113495bSYour Name 		"RSC UNLOADING: %d\n"
518*5113495bSYour Name 		"PENDING CONS REQ: %d\n"
519*5113495bSYour Name 		"IPA PIPES DOWN: %d\n"
520*5113495bSYour Name 		"IPA UC LOADED: %d\n"
521*5113495bSYour Name 		"IPA WDI ENABLED: %d\n"
522*5113495bSYour Name 		"NUM SEND MSG: %d\n"
523*5113495bSYour Name 		"NUM FREE MSG: %d\n",
524*5113495bSYour Name 		ipa_ctx->num_iface,
525*5113495bSYour Name 		ipa_ctx->rm_state,
526*5113495bSYour Name 		ipa_ctx->activated_fw_pipe,
527*5113495bSYour Name 		ipa_ctx->sap_num_connected_sta,
528*5113495bSYour Name 		ipa_ctx->sta_connected,
529*5113495bSYour Name 		(ipa_ctx->mcc_mode ? "MCC" : "SCC"),
530*5113495bSYour Name 		ipa_ctx->resource_loading,
531*5113495bSYour Name 		ipa_ctx->resource_unloading,
532*5113495bSYour Name 		ipa_ctx->pending_cons_req,
533*5113495bSYour Name 		ipa_ctx->ipa_pipes_down,
534*5113495bSYour Name 		ipa_ctx->uc_loaded,
535*5113495bSYour Name 		ipa_ctx->wdi_enabled,
536*5113495bSYour Name 		(unsigned int)ipa_ctx->stats.num_send_msg,
537*5113495bSYour Name 		(unsigned int)ipa_ctx->stats.num_free_msg);
538*5113495bSYour Name 
539*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_IFACE; i++) {
540*5113495bSYour Name 		iface_context = &ipa_ctx->iface_context[i];
541*5113495bSYour Name 
542*5113495bSYour Name 		if (iface_context->session_id == WLAN_IPA_MAX_SESSION)
543*5113495bSYour Name 			continue;
544*5113495bSYour Name 
545*5113495bSYour Name 		ipa_info("\nIFACE[%d]: mode:%d, offload:%d",
546*5113495bSYour Name 			 i, iface_context->device_mode,
547*5113495bSYour Name 			 ipa_ctx->vdev_offload_enabled[iface_context->
548*5113495bSYour Name 						       session_id]);
549*5113495bSYour Name 	}
550*5113495bSYour Name 
551*5113495bSYour Name 	for (i = 0; i < QDF_IPA_WLAN_EVENT_MAX; i++)
552*5113495bSYour Name 		ipa_info("\nEVENT[%d]=%d",
553*5113495bSYour Name 			 i, ipa_ctx->stats.event[i]);
554*5113495bSYour Name 
555*5113495bSYour Name 	i = 0;
556*5113495bSYour Name 	qdf_list_peek_front(&ipa_ctx->pending_event,
557*5113495bSYour Name 			(qdf_list_node_t **)&event);
558*5113495bSYour Name 	while (event) {
559*5113495bSYour Name 		ipa_info("PENDING EVENT[%d]: EVT:%s, MAC:"QDF_MAC_ADDR_FMT,
560*5113495bSYour Name 			 i, wlan_ipa_wlan_event_to_str(event->type),
561*5113495bSYour Name 			 QDF_MAC_ADDR_REF(event->mac_addr));
562*5113495bSYour Name 
563*5113495bSYour Name 		qdf_list_peek_next(&ipa_ctx->pending_event,
564*5113495bSYour Name 				   (qdf_list_node_t *)event,
565*5113495bSYour Name 				   (qdf_list_node_t **)&next);
566*5113495bSYour Name 		event = next;
567*5113495bSYour Name 		next = NULL;
568*5113495bSYour Name 		i++;
569*5113495bSYour Name 	}
570*5113495bSYour Name }
571*5113495bSYour Name 
572*5113495bSYour Name /**
573*5113495bSYour Name  * wlan_ipa_print_txrx_stats - Print IPA TX/RX stats
574*5113495bSYour Name  * @ipa_ctx: IPA private context structure
575*5113495bSYour Name  *
576*5113495bSYour Name  * Return: None
577*5113495bSYour Name  */
wlan_ipa_print_txrx_stats(struct wlan_ipa_priv * ipa_ctx)578*5113495bSYour Name static void wlan_ipa_print_txrx_stats(struct wlan_ipa_priv *ipa_ctx)
579*5113495bSYour Name {
580*5113495bSYour Name 	int i;
581*5113495bSYour Name 	struct wlan_ipa_iface_context *iface_context = NULL;
582*5113495bSYour Name 
583*5113495bSYour Name 	ipa_info("\n==== IPA IPA TX/RX STATS ====\n"
584*5113495bSYour Name 		"NUM RM GRANT: %llu\n"
585*5113495bSYour Name 		"NUM RM RELEASE: %llu\n"
586*5113495bSYour Name 		"NUM RM GRANT IMM: %llu\n"
587*5113495bSYour Name 		"NUM CONS PERF REQ: %llu\n"
588*5113495bSYour Name 		"NUM PROD PERF REQ: %llu\n"
589*5113495bSYour Name 		"NUM RX DROP: %llu\n"
590*5113495bSYour Name 		"NUM EXCP PKT: %llu\n"
591*5113495bSYour Name 		"NUM TX FWD OK: %llu\n"
592*5113495bSYour Name 		"NUM TX FWD ERR: %llu\n"
593*5113495bSYour Name 		"NUM TX DESC Q CNT: %llu\n"
594*5113495bSYour Name 		"NUM TX DESC ERROR: %llu\n"
595*5113495bSYour Name 		"NUM TX COMP CNT: %llu\n"
596*5113495bSYour Name 		"NUM TX QUEUED: %llu\n"
597*5113495bSYour Name 		"NUM TX DEQUEUED: %llu\n"
598*5113495bSYour Name 		"NUM MAX PM QUEUE: %llu\n"
599*5113495bSYour Name 		"TX REF CNT: %d\n"
600*5113495bSYour Name 		"SUSPENDED: %d\n"
601*5113495bSYour Name 		"PEND DESC HEAD: %pK\n"
602*5113495bSYour Name 		"TX DESC LIST: %pK\n",
603*5113495bSYour Name 		ipa_ctx->stats.num_rm_grant,
604*5113495bSYour Name 		ipa_ctx->stats.num_rm_release,
605*5113495bSYour Name 		ipa_ctx->stats.num_rm_grant_imm,
606*5113495bSYour Name 		ipa_ctx->stats.num_cons_perf_req,
607*5113495bSYour Name 		ipa_ctx->stats.num_prod_perf_req,
608*5113495bSYour Name 		ipa_ctx->stats.num_rx_drop,
609*5113495bSYour Name 		ipa_ctx->stats.num_rx_excep,
610*5113495bSYour Name 		ipa_ctx->stats.num_tx_fwd_ok,
611*5113495bSYour Name 		ipa_ctx->stats.num_tx_fwd_err,
612*5113495bSYour Name 		ipa_ctx->stats.num_tx_desc_q_cnt,
613*5113495bSYour Name 		ipa_ctx->stats.num_tx_desc_error,
614*5113495bSYour Name 		ipa_ctx->stats.num_tx_comp_cnt,
615*5113495bSYour Name 		ipa_ctx->stats.num_tx_queued,
616*5113495bSYour Name 		ipa_ctx->stats.num_tx_dequeued,
617*5113495bSYour Name 		ipa_ctx->stats.num_max_pm_queue,
618*5113495bSYour Name 		ipa_ctx->tx_ref_cnt.counter,
619*5113495bSYour Name 		ipa_ctx->suspended,
620*5113495bSYour Name 		&ipa_ctx->pend_desc_head,
621*5113495bSYour Name 		&ipa_ctx->tx_desc_free_list);
622*5113495bSYour Name 
623*5113495bSYour Name 	for (i = 0; i < WLAN_IPA_MAX_IFACE; i++) {
624*5113495bSYour Name 
625*5113495bSYour Name 		iface_context = &ipa_ctx->iface_context[i];
626*5113495bSYour Name 		if (iface_context->session_id == WLAN_IPA_MAX_SESSION)
627*5113495bSYour Name 			continue;
628*5113495bSYour Name 
629*5113495bSYour Name 		ipa_info("IFACE[%d]: TX:%llu, TX DROP:%llu, TX ERR:%llu,"
630*5113495bSYour Name 			 " TX CAC DROP:%llu, RX IPA EXCEP:%llu",
631*5113495bSYour Name 			 i, iface_context->stats.num_tx,
632*5113495bSYour Name 			 iface_context->stats.num_tx_drop,
633*5113495bSYour Name 			 iface_context->stats.num_tx_err,
634*5113495bSYour Name 			 iface_context->stats.num_tx_cac_drop,
635*5113495bSYour Name 			 iface_context->stats.num_rx_ipa_excep);
636*5113495bSYour Name 	}
637*5113495bSYour Name }
638*5113495bSYour Name 
wlan_ipa_print_fw_wdi_stats(struct wlan_ipa_priv * ipa_ctx,struct ipa_uc_fw_stats * uc_fw_stat)639*5113495bSYour Name void wlan_ipa_print_fw_wdi_stats(struct wlan_ipa_priv *ipa_ctx,
640*5113495bSYour Name 				 struct ipa_uc_fw_stats *uc_fw_stat)
641*5113495bSYour Name {
642*5113495bSYour Name 	ipa_info("\n==== WLAN FW WDI TX STATS ====\n"
643*5113495bSYour Name 		"COMP RING SIZE: %d\n"
644*5113495bSYour Name 		"COMP RING DBELL IND VAL : %d\n"
645*5113495bSYour Name 		"COMP RING DBELL CACHED VAL : %d\n"
646*5113495bSYour Name 		"PKTS ENQ : %d\n"
647*5113495bSYour Name 		"PKTS COMP : %d\n"
648*5113495bSYour Name 		"IS SUSPEND : %d\n",
649*5113495bSYour Name 		uc_fw_stat->tx_comp_ring_size,
650*5113495bSYour Name 		uc_fw_stat->tx_comp_ring_dbell_ind_val,
651*5113495bSYour Name 		uc_fw_stat->tx_comp_ring_dbell_cached_val,
652*5113495bSYour Name 		uc_fw_stat->tx_pkts_enqueued,
653*5113495bSYour Name 		uc_fw_stat->tx_pkts_completed,
654*5113495bSYour Name 		uc_fw_stat->tx_is_suspend);
655*5113495bSYour Name 
656*5113495bSYour Name 	ipa_info("\n==== WLAN FW WDI RX STATS ====\n"
657*5113495bSYour Name 		"IND RING SIZE: %d\n"
658*5113495bSYour Name 		"IND RING DBELL IND VAL : %d\n"
659*5113495bSYour Name 		"IND RING DBELL CACHED VAL : %d\n"
660*5113495bSYour Name 		"RDY IND CACHE VAL : %d\n"
661*5113495bSYour Name 		"RFIL IND : %d\n"
662*5113495bSYour Name 		"NUM PKT INDICAT : %d\n"
663*5113495bSYour Name 		"BUF REFIL : %d\n"
664*5113495bSYour Name 		"NUM DROP NO SPC : %d\n"
665*5113495bSYour Name 		"NUM DROP NO BUF : %d\n"
666*5113495bSYour Name 		"IS SUSPND : %d\n",
667*5113495bSYour Name 		uc_fw_stat->rx_ind_ring_size,
668*5113495bSYour Name 		uc_fw_stat->rx_ind_ring_dbell_ind_val,
669*5113495bSYour Name 		uc_fw_stat->rx_ind_ring_dbell_ind_cached_val,
670*5113495bSYour Name 		uc_fw_stat->rx_ind_ring_rd_idx_cached_val,
671*5113495bSYour Name 		uc_fw_stat->rx_refill_idx,
672*5113495bSYour Name 		uc_fw_stat->rx_num_pkts_indicated,
673*5113495bSYour Name 		uc_fw_stat->rx_buf_refilled,
674*5113495bSYour Name 		uc_fw_stat->rx_num_ind_drop_no_space,
675*5113495bSYour Name 		uc_fw_stat->rx_num_ind_drop_no_buf,
676*5113495bSYour Name 		uc_fw_stat->rx_is_suspend);
677*5113495bSYour Name }
678*5113495bSYour Name 
679*5113495bSYour Name /**
680*5113495bSYour Name  * wlan_ipa_print_ipa_wdi_stats - Print IPA WDI stats
681*5113495bSYour Name  * @ipa_ctx: IPA context
682*5113495bSYour Name  *
683*5113495bSYour Name  * Return: None
684*5113495bSYour Name  */
wlan_ipa_print_ipa_wdi_stats(struct wlan_ipa_priv * ipa_ctx)685*5113495bSYour Name static void wlan_ipa_print_ipa_wdi_stats(struct wlan_ipa_priv *ipa_ctx)
686*5113495bSYour Name {
687*5113495bSYour Name 	qdf_ipa_hw_stats_wdi_info_data_t ipa_stat;
688*5113495bSYour Name 
689*5113495bSYour Name 	qdf_ipa_get_wdi_stats(&ipa_stat);
690*5113495bSYour Name 
691*5113495bSYour Name 	ipa_info("\n==== IPA WDI TX STATS ====\n"
692*5113495bSYour Name 		"NUM PROCD : %d\n"
693*5113495bSYour Name 		"CE DBELL : 0x%x\n"
694*5113495bSYour Name 		"NUM DBELL FIRED : %d\n"
695*5113495bSYour Name 		"COMP RNG FULL : %d\n"
696*5113495bSYour Name 		"COMP RNG EMPT : %d\n"
697*5113495bSYour Name 		"COMP RNG USE HGH : %d\n"
698*5113495bSYour Name 		"COMP RNG USE LOW : %d\n"
699*5113495bSYour Name 		"BAM FIFO FULL : %d\n"
700*5113495bSYour Name 		"BAM FIFO EMPT : %d\n"
701*5113495bSYour Name 		"BAM FIFO USE HGH : %d\n"
702*5113495bSYour Name 		"BAM FIFO USE LOW : %d\n"
703*5113495bSYour Name 		"NUM DBELL : %d\n"
704*5113495bSYour Name 		"NUM UNEXP DBELL : %d\n"
705*5113495bSYour Name 		"NUM BAM INT HDL : 0x%x\n"
706*5113495bSYour Name 		"NUM QMB INT HDL : 0x%x\n",
707*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_pkts_processed,
708*5113495bSYour Name 		ipa_stat.tx_ch_stats.copy_engine_doorbell_value,
709*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_db_fired,
710*5113495bSYour Name 		ipa_stat.tx_ch_stats.tx_comp_ring_stats.ringFull,
711*5113495bSYour Name 		ipa_stat.tx_ch_stats.tx_comp_ring_stats.ringEmpty,
712*5113495bSYour Name 		ipa_stat.tx_ch_stats.tx_comp_ring_stats.ringUsageHigh,
713*5113495bSYour Name 		ipa_stat.tx_ch_stats.tx_comp_ring_stats.ringUsageLow,
714*5113495bSYour Name 		ipa_stat.tx_ch_stats.bam_stats.bamFifoFull,
715*5113495bSYour Name 		ipa_stat.tx_ch_stats.bam_stats.bamFifoEmpty,
716*5113495bSYour Name 		ipa_stat.tx_ch_stats.bam_stats.bamFifoUsageHigh,
717*5113495bSYour Name 		ipa_stat.tx_ch_stats.bam_stats.bamFifoUsageLow,
718*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_db,
719*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_unexpected_db,
720*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_bam_int_handled,
721*5113495bSYour Name 		ipa_stat.tx_ch_stats.num_qmb_int_handled);
722*5113495bSYour Name 
723*5113495bSYour Name 	ipa_info("\n==== IPA WDI RX STATS ====\n"
724*5113495bSYour Name 		"MAX OST PKT : %d\n"
725*5113495bSYour Name 		"NUM PKT PRCSD : %d\n"
726*5113495bSYour Name 		"RNG RP : 0x%x\n"
727*5113495bSYour Name 		"IND RNG FULL : %d\n"
728*5113495bSYour Name 		"IND RNG EMPT : %d\n"
729*5113495bSYour Name 		"IND RNG USE HGH : %d\n"
730*5113495bSYour Name 		"IND RNG USE LOW : %d\n"
731*5113495bSYour Name 		"BAM FIFO FULL : %d\n"
732*5113495bSYour Name 		"BAM FIFO EMPT : %d\n"
733*5113495bSYour Name 		"BAM FIFO USE HGH : %d\n"
734*5113495bSYour Name 		"BAM FIFO USE LOW : %d\n"
735*5113495bSYour Name 		"NUM DB : %d\n"
736*5113495bSYour Name 		"NUM UNEXP DB : %d\n"
737*5113495bSYour Name 		"NUM BAM INT HNDL : 0x%x\n",
738*5113495bSYour Name 		ipa_stat.rx_ch_stats.max_outstanding_pkts,
739*5113495bSYour Name 		ipa_stat.rx_ch_stats.num_pkts_processed,
740*5113495bSYour Name 		ipa_stat.rx_ch_stats.rx_ring_rp_value,
741*5113495bSYour Name 		ipa_stat.rx_ch_stats.rx_ind_ring_stats.ringFull,
742*5113495bSYour Name 		ipa_stat.rx_ch_stats.rx_ind_ring_stats.ringEmpty,
743*5113495bSYour Name 		ipa_stat.rx_ch_stats.rx_ind_ring_stats.ringUsageHigh,
744*5113495bSYour Name 		ipa_stat.rx_ch_stats.rx_ind_ring_stats.ringUsageLow,
745*5113495bSYour Name 		ipa_stat.rx_ch_stats.bam_stats.bamFifoFull,
746*5113495bSYour Name 		ipa_stat.rx_ch_stats.bam_stats.bamFifoEmpty,
747*5113495bSYour Name 		ipa_stat.rx_ch_stats.bam_stats.bamFifoUsageHigh,
748*5113495bSYour Name 		ipa_stat.rx_ch_stats.bam_stats.bamFifoUsageLow,
749*5113495bSYour Name 		ipa_stat.rx_ch_stats.num_db,
750*5113495bSYour Name 		ipa_stat.rx_ch_stats.num_unexpected_db,
751*5113495bSYour Name 		ipa_stat.rx_ch_stats.num_bam_int_handled);
752*5113495bSYour Name }
753*5113495bSYour Name 
wlan_ipa_uc_info(struct wlan_ipa_priv * ipa_ctx)754*5113495bSYour Name void wlan_ipa_uc_info(struct wlan_ipa_priv *ipa_ctx)
755*5113495bSYour Name {
756*5113495bSYour Name 	wlan_ipa_print_session_info(ipa_ctx);
757*5113495bSYour Name }
758*5113495bSYour Name 
wlan_ipa_uc_stat(struct wlan_ipa_priv * ipa_ctx)759*5113495bSYour Name void wlan_ipa_uc_stat(struct wlan_ipa_priv *ipa_ctx)
760*5113495bSYour Name {
761*5113495bSYour Name 	/* IPA IPA TX/RX stats */
762*5113495bSYour Name 	wlan_ipa_print_txrx_stats(ipa_ctx);
763*5113495bSYour Name 	/* IPA WDI stats */
764*5113495bSYour Name 	wlan_ipa_print_ipa_wdi_stats(ipa_ctx);
765*5113495bSYour Name 	/* WLAN FW WDI stats */
766*5113495bSYour Name 	wlan_ipa_uc_stat_request(ipa_ctx, WLAN_IPA_UC_STAT_REASON_DEBUG);
767*5113495bSYour Name }
768*5113495bSYour Name 
769*5113495bSYour Name #ifdef FEATURE_METERING
770*5113495bSYour Name 
771*5113495bSYour Name #ifdef WDI3_STATS_UPDATE
772*5113495bSYour Name #ifdef WDI3_STATS_BW_MONITOR
773*5113495bSYour Name /**
774*5113495bSYour Name  * __wlan_ipa_wdi_meter_notifier_cb() - WLAN to IPA callback handler.
775*5113495bSYour Name  * IPA calls to get WLAN stats or set quota limit.
776*5113495bSYour Name  * @evt: the IPA event which triggered the callback
777*5113495bSYour Name  * @data: data associated with the event
778*5113495bSYour Name  *
779*5113495bSYour Name  * Return: None
780*5113495bSYour Name  */
__wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,void * data)781*5113495bSYour Name static void __wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,
782*5113495bSYour Name 					     void *data)
783*5113495bSYour Name {
784*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx = wlan_ipa_get_obj_context();
785*5113495bSYour Name 	struct qdf_ipa_inform_wlan_bw *bw_info;
786*5113495bSYour Name 	uint8_t bw_level_index;
787*5113495bSYour Name 	uint64_t throughput;
788*5113495bSYour Name 
789*5113495bSYour Name 	if (evt != IPA_INFORM_WLAN_BW)
790*5113495bSYour Name 		return;
791*5113495bSYour Name 
792*5113495bSYour Name 	bw_info = data;
793*5113495bSYour Name 	bw_level_index = QDF_IPA_INFORM_WLAN_BW_INDEX(bw_info);
794*5113495bSYour Name 	throughput = QDF_IPA_INFORM_WLAN_BW_THROUGHPUT(bw_info);
795*5113495bSYour Name 	ipa_debug("bw_info idx:%d tp:%llu", bw_level_index, throughput);
796*5113495bSYour Name 
797*5113495bSYour Name 	if (bw_level_index == ipa_ctx->curr_bw_level)
798*5113495bSYour Name 		return;
799*5113495bSYour Name 
800*5113495bSYour Name 	if (bw_level_index == WLAN_IPA_BW_LEVEL_LOW) {
801*5113495bSYour Name 		cdp_ipa_set_perf_level(ipa_ctx->dp_soc,
802*5113495bSYour Name 				       QDF_IPA_CLIENT_WLAN2_CONS,
803*5113495bSYour Name 				       ipa_ctx->config->ipa_bw_low);
804*5113495bSYour Name 		ipa_ctx->curr_bw_level = WLAN_IPA_BW_LEVEL_LOW;
805*5113495bSYour Name 	} else if (bw_level_index == WLAN_IPA_BW_LEVEL_MEDIUM) {
806*5113495bSYour Name 		cdp_ipa_set_perf_level(ipa_ctx->dp_soc,
807*5113495bSYour Name 				       QDF_IPA_CLIENT_WLAN2_CONS,
808*5113495bSYour Name 				       ipa_ctx->config->ipa_bw_medium);
809*5113495bSYour Name 		ipa_ctx->curr_bw_level = WLAN_IPA_BW_LEVEL_MEDIUM;
810*5113495bSYour Name 	} else if (bw_level_index == WLAN_IPA_BW_LEVEL_HIGH) {
811*5113495bSYour Name 		cdp_ipa_set_perf_level(ipa_ctx->dp_soc,
812*5113495bSYour Name 				       QDF_IPA_CLIENT_WLAN2_CONS,
813*5113495bSYour Name 				       ipa_ctx->config->ipa_bw_high);
814*5113495bSYour Name 		ipa_ctx->curr_bw_level = WLAN_IPA_BW_LEVEL_HIGH;
815*5113495bSYour Name 	}
816*5113495bSYour Name 
817*5113495bSYour Name 	ipa_debug("Requested BW level: %d", ipa_ctx->curr_bw_level);
818*5113495bSYour Name }
819*5113495bSYour Name 
820*5113495bSYour Name #else
__wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,void * data)821*5113495bSYour Name static void __wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,
822*5113495bSYour Name 					     void *data)
823*5113495bSYour Name {
824*5113495bSYour Name }
825*5113495bSYour Name #endif
826*5113495bSYour Name 
wlan_ipa_update_tx_stats(struct wlan_ipa_priv * ipa_ctx,uint64_t sta_tx,uint64_t ap_tx)827*5113495bSYour Name void wlan_ipa_update_tx_stats(struct wlan_ipa_priv *ipa_ctx, uint64_t sta_tx,
828*5113495bSYour Name 			      uint64_t ap_tx)
829*5113495bSYour Name {
830*5113495bSYour Name 	qdf_ipa_wdi_tx_info_t tx_stats;
831*5113495bSYour Name 
832*5113495bSYour Name 	if (!qdf_atomic_read(&ipa_ctx->stats_quota))
833*5113495bSYour Name 		return;
834*5113495bSYour Name 
835*5113495bSYour Name 	QDF_IPA_WDI_TX_INFO_STA_TX_BYTES(&tx_stats) = sta_tx;
836*5113495bSYour Name 	QDF_IPA_WDI_TX_INFO_SAP_TX_BYTES(&tx_stats) = ap_tx;
837*5113495bSYour Name 
838*5113495bSYour Name 	qdf_ipa_wdi_wlan_stats(&tx_stats);
839*5113495bSYour Name }
840*5113495bSYour Name 
841*5113495bSYour Name #else
842*5113495bSYour Name 
843*5113495bSYour Name /**
844*5113495bSYour Name  * wlan_ipa_uc_sharing_stats_request() - Get IPA stats from IPA.
845*5113495bSYour Name  * @ipa_ctx: IPA context
846*5113495bSYour Name  * @reset_stats: reset stat countis after response
847*5113495bSYour Name  *
848*5113495bSYour Name  * Return: None
849*5113495bSYour Name  */
wlan_ipa_uc_sharing_stats_request(struct wlan_ipa_priv * ipa_ctx,uint8_t reset_stats)850*5113495bSYour Name static void wlan_ipa_uc_sharing_stats_request(struct wlan_ipa_priv *ipa_ctx,
851*5113495bSYour Name 					      uint8_t reset_stats)
852*5113495bSYour Name {
853*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->ipa_lock);
854*5113495bSYour Name 	if (false == ipa_ctx->resource_loading) {
855*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
856*5113495bSYour Name 		cdp_ipa_uc_get_share_stats(ipa_ctx->dp_soc, ipa_ctx->dp_pdev_id,
857*5113495bSYour Name 					   reset_stats);
858*5113495bSYour Name 	} else {
859*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
860*5113495bSYour Name 	}
861*5113495bSYour Name }
862*5113495bSYour Name 
863*5113495bSYour Name /**
864*5113495bSYour Name  * wlan_ipa_uc_set_quota() - Set quota limit bytes from IPA.
865*5113495bSYour Name  * @ipa_ctx: IPA context
866*5113495bSYour Name  * @set_quota: when 1, FW starts quota monitoring
867*5113495bSYour Name  * @quota_bytes: quota limit in bytes
868*5113495bSYour Name  *
869*5113495bSYour Name  * Return: None
870*5113495bSYour Name  */
wlan_ipa_uc_set_quota(struct wlan_ipa_priv * ipa_ctx,uint8_t set_quota,uint64_t quota_bytes)871*5113495bSYour Name static void wlan_ipa_uc_set_quota(struct wlan_ipa_priv *ipa_ctx,
872*5113495bSYour Name 				  uint8_t set_quota,
873*5113495bSYour Name 				  uint64_t quota_bytes)
874*5113495bSYour Name {
875*5113495bSYour Name 	ipa_info("SET_QUOTA: set_quota=%d, quota_bytes=%llu",
876*5113495bSYour Name 		 set_quota, quota_bytes);
877*5113495bSYour Name 
878*5113495bSYour Name 	qdf_mutex_acquire(&ipa_ctx->ipa_lock);
879*5113495bSYour Name 	if (false == ipa_ctx->resource_loading) {
880*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
881*5113495bSYour Name 		cdp_ipa_uc_set_quota(ipa_ctx->dp_soc, ipa_ctx->dp_pdev_id,
882*5113495bSYour Name 				     quota_bytes);
883*5113495bSYour Name 	} else {
884*5113495bSYour Name 		qdf_mutex_release(&ipa_ctx->ipa_lock);
885*5113495bSYour Name 	}
886*5113495bSYour Name }
887*5113495bSYour Name 
888*5113495bSYour Name /**
889*5113495bSYour Name  * __wlan_ipa_wdi_meter_notifier_cb() - WLAN to IPA callback handler.
890*5113495bSYour Name  * IPA calls to get WLAN stats or set quota limit.
891*5113495bSYour Name  * @evt: the IPA event which triggered the callback
892*5113495bSYour Name  * @data: data associated with the event
893*5113495bSYour Name  *
894*5113495bSYour Name  * Return: None
895*5113495bSYour Name  */
__wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,void * data)896*5113495bSYour Name static void __wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,
897*5113495bSYour Name 					     void *data)
898*5113495bSYour Name {
899*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx = wlan_ipa_get_obj_context();
900*5113495bSYour Name 	struct wlan_ipa_iface_context *iface_ctx;
901*5113495bSYour Name 	qdf_ipa_get_wdi_sap_stats_t *wdi_sap_stats;
902*5113495bSYour Name 	qdf_ipa_set_wifi_quota_t *ipa_set_quota;
903*5113495bSYour Name 	QDF_STATUS status;
904*5113495bSYour Name 
905*5113495bSYour Name 	ipa_debug("event=%d", evt);
906*5113495bSYour Name 
907*5113495bSYour Name 	iface_ctx = wlan_ipa_get_iface(ipa_ctx, QDF_STA_MODE);
908*5113495bSYour Name 	if (!iface_ctx) {
909*5113495bSYour Name 		ipa_err_rl("IPA uC share stats failed - no iface");
910*5113495bSYour Name 		return;
911*5113495bSYour Name 	}
912*5113495bSYour Name 
913*5113495bSYour Name 	switch (evt) {
914*5113495bSYour Name 	case IPA_GET_WDI_SAP_STATS:
915*5113495bSYour Name 		/* fill-up ipa_get_wdi_sap_stats structure after getting
916*5113495bSYour Name 		 * ipa_uc_fw_stats from FW
917*5113495bSYour Name 		 */
918*5113495bSYour Name 		wdi_sap_stats = data;
919*5113495bSYour Name 
920*5113495bSYour Name 		qdf_event_reset(&ipa_ctx->ipa_uc_sharing_stats_comp);
921*5113495bSYour Name 		wlan_ipa_uc_sharing_stats_request(ipa_ctx,
922*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_RESET_STATS(wdi_sap_stats));
923*5113495bSYour Name 		status = qdf_wait_for_event_completion(
924*5113495bSYour Name 			&ipa_ctx->ipa_uc_sharing_stats_comp,
925*5113495bSYour Name 			IPA_UC_SHARING_STATES_WAIT_TIME);
926*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
927*5113495bSYour Name 			ipa_err("IPA uC share stats request timed out");
928*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_STATS_VALID(wdi_sap_stats)
929*5113495bSYour Name 				= 0;
930*5113495bSYour Name 		} else {
931*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_STATS_VALID(wdi_sap_stats)
932*5113495bSYour Name 				= 1;
933*5113495bSYour Name 
934*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV4_RX_PACKETS(wdi_sap_stats)
935*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv4_rx_packets;
936*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV4_RX_BYTES(wdi_sap_stats)
937*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv4_rx_bytes;
938*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV6_RX_PACKETS(wdi_sap_stats)
939*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv6_rx_packets;
940*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV6_RX_BYTES(wdi_sap_stats)
941*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv6_rx_bytes;
942*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV4_TX_PACKETS(wdi_sap_stats)
943*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv4_tx_packets;
944*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV4_TX_BYTES(wdi_sap_stats)
945*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv4_tx_bytes;
946*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV6_TX_PACKETS(wdi_sap_stats)
947*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv6_tx_packets;
948*5113495bSYour Name 			QDF_IPA_GET_WDI_SAP_STATS_IPV6_TX_BYTES(wdi_sap_stats)
949*5113495bSYour Name 				= ipa_ctx->ipa_sharing_stats.ipv6_tx_bytes;
950*5113495bSYour Name 		}
951*5113495bSYour Name 		break;
952*5113495bSYour Name 
953*5113495bSYour Name 	case IPA_SET_WIFI_QUOTA:
954*5113495bSYour Name 		/* get ipa_set_wifi_quota structure from IPA and pass to FW
955*5113495bSYour Name 		 * through quota_exceeded field in ipa_uc_fw_stats
956*5113495bSYour Name 		 */
957*5113495bSYour Name 		ipa_set_quota = data;
958*5113495bSYour Name 
959*5113495bSYour Name 		qdf_event_reset(&ipa_ctx->ipa_uc_set_quota_comp);
960*5113495bSYour Name 		wlan_ipa_uc_set_quota(ipa_ctx, ipa_set_quota->set_quota,
961*5113495bSYour Name 				      ipa_set_quota->quota_bytes);
962*5113495bSYour Name 
963*5113495bSYour Name 		status = qdf_wait_for_event_completion(
964*5113495bSYour Name 				&ipa_ctx->ipa_uc_set_quota_comp,
965*5113495bSYour Name 				IPA_UC_SET_QUOTA_WAIT_TIME);
966*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
967*5113495bSYour Name 			ipa_err("IPA uC set quota request timed out");
968*5113495bSYour Name 			QDF_IPA_SET_WIFI_QUOTA_SET_VALID(ipa_set_quota)	= 0;
969*5113495bSYour Name 		} else {
970*5113495bSYour Name 			QDF_IPA_SET_WIFI_QUOTA_BYTES(ipa_set_quota) =
971*5113495bSYour Name 				((uint64_t)(ipa_ctx->ipa_quota_rsp.quota_hi)
972*5113495bSYour Name 				  <<32)|ipa_ctx->ipa_quota_rsp.quota_lo;
973*5113495bSYour Name 			QDF_IPA_SET_WIFI_QUOTA_SET_VALID(ipa_set_quota)	=
974*5113495bSYour Name 				ipa_ctx->ipa_quota_rsp.success;
975*5113495bSYour Name 		}
976*5113495bSYour Name 		break;
977*5113495bSYour Name 
978*5113495bSYour Name 	default:
979*5113495bSYour Name 		break;
980*5113495bSYour Name 	}
981*5113495bSYour Name }
982*5113495bSYour Name 
wlan_ipa_uc_op_metering(struct wlan_ipa_priv * ipa_ctx,struct op_msg_type * op_msg)983*5113495bSYour Name QDF_STATUS wlan_ipa_uc_op_metering(struct wlan_ipa_priv *ipa_ctx,
984*5113495bSYour Name 				   struct op_msg_type *op_msg)
985*5113495bSYour Name {
986*5113495bSYour Name 	struct op_msg_type *msg = op_msg;
987*5113495bSYour Name 	struct ipa_uc_sharing_stats *uc_sharing_stats;
988*5113495bSYour Name 	struct ipa_uc_quota_rsp *uc_quota_rsp;
989*5113495bSYour Name 	struct ipa_uc_quota_ind *uc_quota_ind;
990*5113495bSYour Name 	struct wlan_ipa_iface_context *iface_ctx;
991*5113495bSYour Name 	uint64_t quota_bytes;
992*5113495bSYour Name 
993*5113495bSYour Name 	if (msg->op_code == WLAN_IPA_UC_OPCODE_SHARING_STATS) {
994*5113495bSYour Name 		/* fill-up ipa_uc_sharing_stats structure from FW */
995*5113495bSYour Name 		uc_sharing_stats = (struct ipa_uc_sharing_stats *)
996*5113495bSYour Name 			     ((uint8_t *)op_msg + sizeof(struct op_msg_type));
997*5113495bSYour Name 
998*5113495bSYour Name 		memcpy(&ipa_ctx->ipa_sharing_stats, uc_sharing_stats,
999*5113495bSYour Name 		       sizeof(struct ipa_uc_sharing_stats));
1000*5113495bSYour Name 
1001*5113495bSYour Name 		qdf_event_set(&ipa_ctx->ipa_uc_sharing_stats_comp);
1002*5113495bSYour Name 	} else if (msg->op_code == WLAN_IPA_UC_OPCODE_QUOTA_RSP) {
1003*5113495bSYour Name 		/* received set quota response */
1004*5113495bSYour Name 		uc_quota_rsp = (struct ipa_uc_quota_rsp *)
1005*5113495bSYour Name 			     ((uint8_t *)op_msg + sizeof(struct op_msg_type));
1006*5113495bSYour Name 
1007*5113495bSYour Name 		memcpy(&ipa_ctx->ipa_quota_rsp, uc_quota_rsp,
1008*5113495bSYour Name 		       sizeof(struct ipa_uc_quota_rsp));
1009*5113495bSYour Name 
1010*5113495bSYour Name 		qdf_event_set(&ipa_ctx->ipa_uc_set_quota_comp);
1011*5113495bSYour Name 	} else if (msg->op_code == WLAN_IPA_UC_OPCODE_QUOTA_IND) {
1012*5113495bSYour Name 		/* hit quota limit */
1013*5113495bSYour Name 		uc_quota_ind = (struct ipa_uc_quota_ind *)
1014*5113495bSYour Name 			     ((uint8_t *)op_msg + sizeof(struct op_msg_type));
1015*5113495bSYour Name 
1016*5113495bSYour Name 		ipa_ctx->ipa_quota_ind.quota_bytes =
1017*5113495bSYour Name 					uc_quota_ind->quota_bytes;
1018*5113495bSYour Name 
1019*5113495bSYour Name 		/* send quota exceeded indication to IPA */
1020*5113495bSYour Name 		iface_ctx = wlan_ipa_get_iface(ipa_ctx, QDF_STA_MODE);
1021*5113495bSYour Name 		quota_bytes = uc_quota_ind->quota_bytes;
1022*5113495bSYour Name 		if (iface_ctx)
1023*5113495bSYour Name 			qdf_ipa_broadcast_wdi_quota_reach_ind(
1024*5113495bSYour Name 							iface_ctx->dev->ifindex,
1025*5113495bSYour Name 							quota_bytes);
1026*5113495bSYour Name 		else
1027*5113495bSYour Name 			ipa_err("Failed quota_reach_ind: NULL interface");
1028*5113495bSYour Name 	} else {
1029*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1030*5113495bSYour Name 	}
1031*5113495bSYour Name 
1032*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1033*5113495bSYour Name }
1034*5113495bSYour Name #endif /* WDI3_STATS_UPDATE */
1035*5113495bSYour Name 
wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,void * data)1036*5113495bSYour Name void wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,
1037*5113495bSYour Name 				    void *data)
1038*5113495bSYour Name {
1039*5113495bSYour Name 	struct qdf_op_sync *op_sync;
1040*5113495bSYour Name 
1041*5113495bSYour Name 	if (qdf_op_protect(&op_sync))
1042*5113495bSYour Name 		return;
1043*5113495bSYour Name 
1044*5113495bSYour Name 	__wlan_ipa_wdi_meter_notifier_cb(evt, data);
1045*5113495bSYour Name 
1046*5113495bSYour Name 	qdf_op_unprotect(op_sync);
1047*5113495bSYour Name }
1048*5113495bSYour Name #endif /* FEATURE_METERING */
1049