11// SPDX-License-Identifier: BSD-3-Clause-Clear
22/*
33 * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4- * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4+ * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
55 */
66
77#include <linux/vmalloc.h>
@@ -93,57 +93,14 @@ void ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
9393 spin_unlock_bh (& dbr_data -> lock );
9494}
9595
96- static void ath11k_debugfs_fw_stats_reset (struct ath11k * ar )
97- {
98- spin_lock_bh (& ar -> data_lock );
99- ar -> fw_stats_done = false;
100- ath11k_fw_stats_pdevs_free (& ar -> fw_stats .pdevs );
101- ath11k_fw_stats_vdevs_free (& ar -> fw_stats .vdevs );
102- spin_unlock_bh (& ar -> data_lock );
103- }
104-
10596void ath11k_debugfs_fw_stats_process (struct ath11k * ar , struct ath11k_fw_stats * stats )
10697{
10798 struct ath11k_base * ab = ar -> ab ;
108- struct ath11k_pdev * pdev ;
109- bool is_end ;
110- static unsigned int num_vdev , num_bcn ;
111- size_t total_vdevs_started = 0 ;
112- int i ;
113-
114- /* WMI_REQUEST_PDEV_STAT request has been already processed */
115-
116- if (stats -> stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT ) {
117- ar -> fw_stats_done = true;
118- return ;
119- }
120-
121- if (stats -> stats_id == WMI_REQUEST_VDEV_STAT ) {
122- if (list_empty (& stats -> vdevs )) {
123- ath11k_warn (ab , "empty vdev stats" );
124- return ;
125- }
126- /* FW sends all the active VDEV stats irrespective of PDEV,
127- * hence limit until the count of all VDEVs started
128- */
129- for (i = 0 ; i < ab -> num_radios ; i ++ ) {
130- pdev = rcu_dereference (ab -> pdevs_active [i ]);
131- if (pdev && pdev -> ar )
132- total_vdevs_started += ar -> num_started_vdevs ;
133- }
134-
135- is_end = ((++ num_vdev ) == total_vdevs_started );
136-
137- list_splice_tail_init (& stats -> vdevs ,
138- & ar -> fw_stats .vdevs );
139-
140- if (is_end ) {
141- ar -> fw_stats_done = true;
142- num_vdev = 0 ;
143- }
144- return ;
145- }
99+ bool is_end = true;
146100
101+ /* WMI_REQUEST_PDEV_STAT, WMI_REQUEST_RSSI_PER_CHAIN_STAT and
102+ * WMI_REQUEST_VDEV_STAT requests have been already processed.
103+ */
147104 if (stats -> stats_id == WMI_REQUEST_BCN_STAT ) {
148105 if (list_empty (& stats -> bcn )) {
149106 ath11k_warn (ab , "empty bcn stats" );
@@ -152,97 +109,18 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *
152109 /* Mark end until we reached the count of all started VDEVs
153110 * within the PDEV
154111 */
155- is_end = ((++ num_bcn ) == ar -> num_started_vdevs );
112+ if (ar -> num_started_vdevs )
113+ is_end = ((++ ar -> fw_stats .num_bcn_recvd ) ==
114+ ar -> num_started_vdevs );
156115
157116 list_splice_tail_init (& stats -> bcn ,
158117 & ar -> fw_stats .bcn );
159118
160- if (is_end ) {
161- ar -> fw_stats_done = true;
162- num_bcn = 0 ;
163- }
119+ if (is_end )
120+ complete (& ar -> fw_stats_done );
164121 }
165122}
166123
167- static int ath11k_debugfs_fw_stats_request (struct ath11k * ar ,
168- struct stats_request_params * req_param )
169- {
170- struct ath11k_base * ab = ar -> ab ;
171- unsigned long timeout , time_left ;
172- int ret ;
173-
174- lockdep_assert_held (& ar -> conf_mutex );
175-
176- /* FW stats can get split when exceeding the stats data buffer limit.
177- * In that case, since there is no end marking for the back-to-back
178- * received 'update stats' event, we keep a 3 seconds timeout in case,
179- * fw_stats_done is not marked yet
180- */
181- timeout = jiffies + secs_to_jiffies (3 );
182-
183- ath11k_debugfs_fw_stats_reset (ar );
184-
185- reinit_completion (& ar -> fw_stats_complete );
186-
187- ret = ath11k_wmi_send_stats_request_cmd (ar , req_param );
188-
189- if (ret ) {
190- ath11k_warn (ab , "could not request fw stats (%d)\n" ,
191- ret );
192- return ret ;
193- }
194-
195- time_left = wait_for_completion_timeout (& ar -> fw_stats_complete , 1 * HZ );
196-
197- if (!time_left )
198- return - ETIMEDOUT ;
199-
200- for (;;) {
201- if (time_after (jiffies , timeout ))
202- break ;
203-
204- spin_lock_bh (& ar -> data_lock );
205- if (ar -> fw_stats_done ) {
206- spin_unlock_bh (& ar -> data_lock );
207- break ;
208- }
209- spin_unlock_bh (& ar -> data_lock );
210- }
211- return 0 ;
212- }
213-
214- int ath11k_debugfs_get_fw_stats (struct ath11k * ar , u32 pdev_id ,
215- u32 vdev_id , u32 stats_id )
216- {
217- struct ath11k_base * ab = ar -> ab ;
218- struct stats_request_params req_param ;
219- int ret ;
220-
221- mutex_lock (& ar -> conf_mutex );
222-
223- if (ar -> state != ATH11K_STATE_ON ) {
224- ret = - ENETDOWN ;
225- goto err_unlock ;
226- }
227-
228- req_param .pdev_id = pdev_id ;
229- req_param .vdev_id = vdev_id ;
230- req_param .stats_id = stats_id ;
231-
232- ret = ath11k_debugfs_fw_stats_request (ar , & req_param );
233- if (ret )
234- ath11k_warn (ab , "failed to request fw stats: %d\n" , ret );
235-
236- ath11k_dbg (ab , ATH11K_DBG_WMI ,
237- "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n" ,
238- pdev_id , vdev_id , stats_id );
239-
240- err_unlock :
241- mutex_unlock (& ar -> conf_mutex );
242-
243- return ret ;
244- }
245-
246124static int ath11k_open_pdev_stats (struct inode * inode , struct file * file )
247125{
248126 struct ath11k * ar = inode -> i_private ;
@@ -268,7 +146,7 @@ static int ath11k_open_pdev_stats(struct inode *inode, struct file *file)
268146 req_param .vdev_id = 0 ;
269147 req_param .stats_id = WMI_REQUEST_PDEV_STAT ;
270148
271- ret = ath11k_debugfs_fw_stats_request (ar , & req_param );
149+ ret = ath11k_mac_fw_stats_request (ar , & req_param );
272150 if (ret ) {
273151 ath11k_warn (ab , "failed to request fw pdev stats: %d\n" , ret );
274152 goto err_free ;
@@ -339,7 +217,7 @@ static int ath11k_open_vdev_stats(struct inode *inode, struct file *file)
339217 req_param .vdev_id = 0 ;
340218 req_param .stats_id = WMI_REQUEST_VDEV_STAT ;
341219
342- ret = ath11k_debugfs_fw_stats_request (ar , & req_param );
220+ ret = ath11k_mac_fw_stats_request (ar , & req_param );
343221 if (ret ) {
344222 ath11k_warn (ar -> ab , "failed to request fw vdev stats: %d\n" , ret );
345223 goto err_free ;
@@ -415,7 +293,7 @@ static int ath11k_open_bcn_stats(struct inode *inode, struct file *file)
415293 continue ;
416294
417295 req_param .vdev_id = arvif -> vdev_id ;
418- ret = ath11k_debugfs_fw_stats_request (ar , & req_param );
296+ ret = ath11k_mac_fw_stats_request (ar , & req_param );
419297 if (ret ) {
420298 ath11k_warn (ar -> ab , "failed to request fw bcn stats: %d\n" , ret );
421299 goto err_free ;
0 commit comments