• Baochen Qiang's avatar
    wifi: ath12k: fix Smatch warnings on ath12k_core_suspend() · 33370412
    Baochen Qiang authored
    Smatch is throwing below warning:
    
    Commit 692921ea ("wifi: ath12k: flush all packets before
    suspend") leads to the following Smatch static checker warning:
    
    	drivers/net/wireless/ath/ath12k/core.c:58 ath12k_core_suspend()
    	warn: sleeping in atomic context
    
    and also gives the reason:
    
    drivers/net/wireless/ath/ath12k/core.c
        48         int ret, i;
        49
        50         if (!ab->hw_params->supports_suspend)
        51                 return -EOPNOTSUPP;
        52
        53         rcu_read_lock();
                   ^^^^^^^^^^^^^^^
    Disables preemption.
    
        54         for (i = 0; i < ab->num_radios; i++) {
        55                 ar = ath12k_mac_get_ar_by_pdev_id(ab, i);
        56                 if (!ar)
        57                         continue;
    --> 58                 ret = ath12k_mac_wait_tx_complete(ar);
                                            ^^^^^^^
    Sleeping in atomic context.
    
        59                 if (ret) {
        60                         ath12k_warn(ab, "failed to wait tx complete: %d\n", ret);
        61                         rcu_read_unlock();
        62                         return ret;
        63                 }
        64         }
        65         rcu_read_unlock();
    
    But it is weird that no warning on this in run time even with
    CONFIG_DEBUG_ATOMIC_SLEEP=y. With some debug it is found that this is
    because: when system goes to suspend, ath12k_mac_op_stop() gets called
    where then in ath12k_mac_stop() ab->pdevs_active[ar->pdev_idx] is cleared.
    This results in ath12k_mac_get_ar_by_pdev_id() always returning a NULL ar,
    and thereby ath12k_mac_wait_tx_complete() never gets a chance to run.
    
    Fix it by retrieving ar directly from ab->pdevs[].ar instead of using
    ath12k_mac_get_ar_by_pdev_id(). Since ab->pdevs[].ar is set at boot time
    and won't get cleared when suspend, ath12k_mac_wait_tx_complete() won't
    be skipped. In addition, with ath12k_mac_get_ar_by_pdev_id() removed,
    rcu_read_lock()/unlock() are not needed any more, so remove them. This
    also fixes the warning above.
    
    Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4
    
    Fixes: 692921ea ("wifi: ath12k: flush all packets before suspend")
    Reported-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
    Closes: https://lore.kernel.org/ath12k/7a96ca11-80b5-4751-8cfc-fa637f3aa63a@moroto.mountain/Signed-off-by: default avatarBaochen Qiang <quic_bqiang@quicinc.com>
    Acked-by: default avatarJeff Johnson <quic_jjohnson@quicinc.com>
    Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
    Link: https://msgid.link/20240511095045.9623-1-quic_bqiang@quicinc.com
    33370412
core.c 29.9 KB