wifi: ath11k: don't use static variables in ath11k_debugfs_fw_stats_process()
[ Upstream commit 2bcf73b2612dda7432f2c2eaad6679bd291791f2 ]
Currently ath11k_debugfs_fw_stats_process() is using static variables to count
firmware stat events. Taking num_vdev as an example, if for whatever reason (
say ar->num_started_vdevs is 0 or firmware bug etc.) the following condition
(++num_vdev) == total_vdevs_started
is not met, is_end is not set thus num_vdev won't be cleared. Next time when
firmware stats is requested again, even if everything is working fine, we will
fail due to the condition above will never be satisfied.
The same applies to num_bcn as well.
Change to use non-static counters so that we have a chance to clear them each
time firmware stats is requested. Currently only ath11k_fw_stats_request() and
ath11k_debugfs_fw_stats_request() are requesting firmware stats, so clear
counters there.
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37
Fixes: da3a9d3c15
("ath11k: refactor debugfs code into debugfs.c")
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Acked-by: Kalle Valo <kvalo@kernel.org>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250220082448.31039-3-quic_bqiang@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e57c74d760
commit
a0ec9e39cb
@@ -550,6 +550,8 @@ struct ath11k_fw_stats {
|
|||||||
struct list_head pdevs;
|
struct list_head pdevs;
|
||||||
struct list_head vdevs;
|
struct list_head vdevs;
|
||||||
struct list_head bcn;
|
struct list_head bcn;
|
||||||
|
u32 num_vdev_recvd;
|
||||||
|
u32 num_bcn_recvd;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath11k_dbg_htt_stats {
|
struct ath11k_dbg_htt_stats {
|
||||||
|
@@ -98,6 +98,8 @@ static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar)
|
|||||||
spin_lock_bh(&ar->data_lock);
|
spin_lock_bh(&ar->data_lock);
|
||||||
ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
|
ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
|
||||||
ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs);
|
ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs);
|
||||||
|
ar->fw_stats.num_vdev_recvd = 0;
|
||||||
|
ar->fw_stats.num_bcn_recvd = 0;
|
||||||
spin_unlock_bh(&ar->data_lock);
|
spin_unlock_bh(&ar->data_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +108,6 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *
|
|||||||
struct ath11k_base *ab = ar->ab;
|
struct ath11k_base *ab = ar->ab;
|
||||||
struct ath11k_pdev *pdev;
|
struct ath11k_pdev *pdev;
|
||||||
bool is_end;
|
bool is_end;
|
||||||
static unsigned int num_vdev, num_bcn;
|
|
||||||
size_t total_vdevs_started = 0;
|
size_t total_vdevs_started = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -131,15 +132,14 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *
|
|||||||
total_vdevs_started += ar->num_started_vdevs;
|
total_vdevs_started += ar->num_started_vdevs;
|
||||||
}
|
}
|
||||||
|
|
||||||
is_end = ((++num_vdev) == total_vdevs_started);
|
is_end = ((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started);
|
||||||
|
|
||||||
list_splice_tail_init(&stats->vdevs,
|
list_splice_tail_init(&stats->vdevs,
|
||||||
&ar->fw_stats.vdevs);
|
&ar->fw_stats.vdevs);
|
||||||
|
|
||||||
if (is_end) {
|
if (is_end)
|
||||||
complete(&ar->fw_stats_done);
|
complete(&ar->fw_stats_done);
|
||||||
num_vdev = 0;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,15 +151,13 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *
|
|||||||
/* Mark end until we reached the count of all started VDEVs
|
/* Mark end until we reached the count of all started VDEVs
|
||||||
* within the PDEV
|
* within the PDEV
|
||||||
*/
|
*/
|
||||||
is_end = ((++num_bcn) == ar->num_started_vdevs);
|
is_end = ((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs);
|
||||||
|
|
||||||
list_splice_tail_init(&stats->bcn,
|
list_splice_tail_init(&stats->bcn,
|
||||||
&ar->fw_stats.bcn);
|
&ar->fw_stats.bcn);
|
||||||
|
|
||||||
if (is_end) {
|
if (is_end)
|
||||||
complete(&ar->fw_stats_done);
|
complete(&ar->fw_stats_done);
|
||||||
num_bcn = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9011,6 +9011,8 @@ static int ath11k_fw_stats_request(struct ath11k *ar,
|
|||||||
|
|
||||||
spin_lock_bh(&ar->data_lock);
|
spin_lock_bh(&ar->data_lock);
|
||||||
ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
|
ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
|
||||||
|
ar->fw_stats.num_vdev_recvd = 0;
|
||||||
|
ar->fw_stats.num_bcn_recvd = 0;
|
||||||
spin_unlock_bh(&ar->data_lock);
|
spin_unlock_bh(&ar->data_lock);
|
||||||
|
|
||||||
reinit_completion(&ar->fw_stats_complete);
|
reinit_completion(&ar->fw_stats_complete);
|
||||||
|
Reference in New Issue
Block a user