]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: don't wait when there is no vdev started
authorBaochen Qiang <quic_bqiang@quicinc.com>
Thu, 12 Jun 2025 01:31:52 +0000 (09:31 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 17 Jun 2025 23:28:35 +0000 (16:28 -0700)
For WMI_REQUEST_VDEV_STAT request, firmware might split response into
multiple events dut to buffer limit, hence currently in
ath12k_wmi_fw_stats_process() host waits 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)

consequently the requestor would be blocked until 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
directly; if not, follow the old way.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00284.1-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Tested-on: QCN9274 hw2.0 WLAN.WBE.1.5-01651-QCAHKSWPL_SILICONZ-1

Fixes: e367c924768b ("wifi: ath12k: Request vdev stats from firmware")
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Link: https://patch.msgid.link/20250612-ath12k-fw-fixes-v1-4-12f594f3b857@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/wmi.c

index 533e4ddb9a5088585da62ae5569e1a40b446eb5c..465f877fc0fb4b8fa123da136c95010dcc9cd740 100644 (file)
@@ -8165,7 +8165,7 @@ static void ath12k_wmi_fw_stats_process(struct ath12k *ar,
 {
        struct ath12k_base *ab = ar->ab;
        struct ath12k_pdev *pdev;
-       bool is_end;
+       bool is_end = true;
        size_t total_vdevs_started = 0;
        int i;
 
@@ -8185,7 +8185,9 @@ static void ath12k_wmi_fw_stats_process(struct ath12k *ar,
                }
                rcu_read_unlock();
 
-               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,
                                      &ar->fw_stats.vdevs);
@@ -8204,7 +8206,9 @@ static void ath12k_wmi_fw_stats_process(struct ath12k *ar,
                /* Mark end until we reached the count of all started VDEVs
                 * 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,
                                      &ar->fw_stats.bcn);