]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath12k: Avoid napi_sync() before napi_enable()
authorAvula Sri Charan <quic_asrichar@quicinc.com>
Fri, 24 Jan 2025 09:00:58 +0000 (14:30 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:13:40 +0000 (11:13 +0200)
[ Upstream commit 268c73d470a5790a492a2fc2ded084b909d144f3 ]

In case of MHI error a reset work will be queued which will try
napi_disable() after napi_synchronize().

As the napi will be only enabled after qmi_firmware_ready event,
trying napi_synchronize() before napi_enable() will result in
indefinite sleep in case of a firmware crash in QMI init sequence.

To avoid this, introduce napi_enabled flag to check if napi is enabled
or not before calling napi_synchronize().

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1

Signed-off-by: Avula Sri Charan <quic_asrichar@quicinc.com>
Signed-off-by: Tamizh Chelvam Raja <quic_tamizhr@quicinc.com>
Reviewed-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Link: https://patch.msgid.link/20250124090058.3194299-1-quic_tamizhr@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/pci.c

index 6325ac493f82c2d31c55775c52753b1abb279e1d..2699c383fc4c9dc84bb1abf6df3aaa5da4b08009 100644 (file)
@@ -166,6 +166,7 @@ struct ath12k_ext_irq_grp {
        u32 num_irq;
        u32 grp_id;
        u64 timestamp;
+       bool napi_enabled;
        struct napi_struct napi;
        struct net_device *napi_ndev;
 };
index ee14b848454879a668e7465a51827356c718a5d1..895b2314d1d58cf6452a04d6a62d8c6b9aae8e8d 100644 (file)
@@ -483,8 +483,11 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
 
                ath12k_pci_ext_grp_disable(irq_grp);
 
-               napi_synchronize(&irq_grp->napi);
-               napi_disable(&irq_grp->napi);
+               if (irq_grp->napi_enabled) {
+                       napi_synchronize(&irq_grp->napi);
+                       napi_disable(&irq_grp->napi);
+                       irq_grp->napi_enabled = false;
+               }
        }
 }
 
@@ -1114,7 +1117,11 @@ void ath12k_pci_ext_irq_enable(struct ath12k_base *ab)
        for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
-               napi_enable(&irq_grp->napi);
+               if (!irq_grp->napi_enabled) {
+                       napi_enable(&irq_grp->napi);
+                       irq_grp->napi_enabled = true;
+               }
+
                ath12k_pci_ext_grp_enable(irq_grp);
        }