]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ath11k: add CE and ext IRQ flag to indicate irq_handler
authorCarl Huang <cjhuang@codeaurora.org>
Fri, 19 Nov 2021 13:36:26 +0000 (15:36 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 22 Nov 2021 11:11:01 +0000 (13:11 +0200)
This change adds two flags to indicate whether IRQ handler for CE
and DP can be called. This is because in one MSI vector case,
interrupt is not disabled in hif_stop and hif_irq_disable. Otherwise,
MHI interrupt is disabled too.

Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1

Signed-off-by: Carl Huang <cjhuang@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Baochen Qiang <bqiang@codeaurora.org>
Link: https://lore.kernel.org/r/20211026041646.5060-1-bqiang@codeaurora.org
drivers/net/wireless/ath/ath11k/core.h
drivers/net/wireless/ath/ath11k/pci.c

index bbfc10fd5c6d3701ffd7a095b6d13b1431fcc5fa..74dce3518e9b8447bebf19b3f7909bdb859decd0 100644 (file)
@@ -199,6 +199,8 @@ enum ath11k_dev_flags {
        ATH11K_FLAG_REGISTERED,
        ATH11K_FLAG_QMI_FAIL,
        ATH11K_FLAG_HTC_SUSPEND_COMPLETE,
+       ATH11K_FLAG_CE_IRQ_ENABLED,
+       ATH11K_FLAG_EXT_IRQ_ENABLED,
 };
 
 enum ath11k_monitor_flags {
index 305aa7a72c59a5136a68c7738944369a7011cba2..a51fc430065555ce5734cd62c11ff17bb3185a5a 100644 (file)
@@ -578,6 +578,8 @@ static void ath11k_pci_ce_irqs_disable(struct ath11k_base *ab)
 {
        int i;
 
+       clear_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ab->hw_params.ce_count; i++) {
                if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
                        continue;
@@ -611,6 +613,10 @@ static void ath11k_pci_ce_tasklet(struct tasklet_struct *t)
 static irqreturn_t ath11k_pci_ce_interrupt_handler(int irq, void *arg)
 {
        struct ath11k_ce_pipe *ce_pipe = arg;
+       struct ath11k_base *ab = ce_pipe->ab;
+
+       if (!test_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags))
+               return IRQ_HANDLED;
 
        /* last interrupt received for this CE */
        ce_pipe->timestamp = jiffies;
@@ -633,6 +639,8 @@ static void __ath11k_pci_ext_irq_disable(struct ath11k_base *sc)
 {
        int i;
 
+       clear_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &sc->dev_flags);
+
        for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath11k_ext_irq_grp *irq_grp = &sc->ext_irq_grp[i];
 
@@ -655,6 +663,8 @@ static void ath11k_pci_ext_irq_enable(struct ath11k_base *ab)
 {
        int i;
 
+       set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
@@ -706,6 +716,10 @@ static int ath11k_pci_ext_grp_napi_poll(struct napi_struct *napi, int budget)
 static irqreturn_t ath11k_pci_ext_interrupt_handler(int irq, void *arg)
 {
        struct ath11k_ext_irq_grp *irq_grp = arg;
+       struct ath11k_base *ab = irq_grp->ab;
+
+       if (!test_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags))
+               return IRQ_HANDLED;
 
        ath11k_dbg(irq_grp->ab, ATH11K_DBG_PCI, "ext irq:%d\n", irq);
 
@@ -852,6 +866,8 @@ static void ath11k_pci_ce_irqs_enable(struct ath11k_base *ab)
 {
        int i;
 
+       set_bit(ATH11K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ab->hw_params.ce_count; i++) {
                if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
                        continue;