wifi: ath11k: stop tx queues immediately upon firmware exit
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Tue, 27 Sep 2022 06:18:54 +0000 (09:18 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 28 Sep 2022 07:44:52 +0000 (10:44 +0300)
Currently, recovery flag is set immediately upon firmware
exit but tx queues are stopped once firmware arrives back
and is ready which is during ath11k_core_restart. Once
ieee80211 hw restart is completed, tx queues are resumed.
If during the time delta between firmware exit and firmware
ready, mac80211 send packets, currently ath11k will drop it
since recovery flag will be set. But warning prints will
come -
  "ath11k c000000.wifi: failed to transmit frame -108"

If more tx packets are there, this could lead to flooding
of above print.

However, actually tx queues should be stopped immediately
when firmware leaves. This will prevent packets to get
dropped when firmware is recovering.

Add fix to stop tx queues immediately after firmware exit.

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220923170235.18873-1-quic_adisi@quicinc.com
drivers/net/wireless/ath/ath11k/core.c
drivers/net/wireless/ath/ath11k/core.h
drivers/net/wireless/ath/ath11k/qmi.c

index b99180bc81723b150476942667080bad6d80555b..35a5de3a0a8a3bb6b4ec1b29d6a68c58f5d53f77 100644 (file)
@@ -1641,7 +1641,7 @@ static void ath11k_update_11d(struct work_struct *work)
        }
 }
 
-static void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab)
+void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab)
 {
        struct ath11k *ar;
        struct ath11k_pdev *pdev;
@@ -1730,9 +1730,6 @@ static void ath11k_core_restart(struct work_struct *work)
        struct ath11k_base *ab = container_of(work, struct ath11k_base, restart_work);
        int ret;
 
-       if (!ab->is_reset)
-               ath11k_core_pre_reconfigure_recovery(ab);
-
        ret = ath11k_core_reconfigure_on_crash(ab);
        if (ret) {
                ath11k_err(ab, "failed to reconfigure driver on crash recovery\n");
index cf2f52cc4e30de528391dc9c4a9678e01ca810fa..bbcef120c8f6bb3493d635522075505fd0163d29 100644 (file)
@@ -1157,6 +1157,7 @@ int ath11k_core_check_smbios(struct ath11k_base *ab);
 void ath11k_core_halt(struct ath11k *ar);
 int ath11k_core_resume(struct ath11k_base *ab);
 int ath11k_core_suspend(struct ath11k_base *ab);
+void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab);
 
 const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab,
                                                    const char *filename);
index 51de2208b7899cf6eab025299498113ba221e269..775dfb5eb1a7a9a37e4d730e3e2167c7eec29909 100644 (file)
@@ -3158,6 +3158,9 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
                case ATH11K_QMI_EVENT_SERVER_EXIT:
                        set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
                        set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
+
+                       if (!ab->is_reset)
+                               ath11k_core_pre_reconfigure_recovery(ab);
                        break;
                case ATH11K_QMI_EVENT_REQUEST_MEM:
                        ret = ath11k_qmi_event_mem_request(qmi);