wifi: ath11k: don't wait when there is no vdev started
[ Upstream commit 3b6d00fa883075dcaf49221538230e038a9c0b43 ]
For WMI_REQUEST_VDEV_STAT request, firmware might split response into
multiple events dut to buffer limit, hence currently in
ath11k_debugfs_fw_stats_process() we wait until all events received.
In case there is no vdev started, this results in that below condition
would never get satisfied
((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started)
finally the requestor would be blocked until wait time out.
The same applies to WMI_REQUEST_BCN_STAT request as well due to:
((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs)
Change to check the number of started vdev first: if it is zero, finish
wait directly; if not, follow the old way.
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37
Fixes: d5c65159f2
("ath11k: driver for Qualcomm IEEE 802.11ax devices")
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250220082448.31039-4-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
a0ec9e39cb
commit
e8e4057570
@@ -107,7 +107,7 @@ 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 = true;
|
||||||
size_t total_vdevs_started = 0;
|
size_t total_vdevs_started = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -132,7 +132,9 @@ 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 = ((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started);
|
if (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);
|
||||||
@@ -151,7 +153,9 @@ 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 = ((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs);
|
if (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);
|
||||||
|
Reference in New Issue
Block a user