Skip to content

Commit d943fda

Browse files
greearbkvalo
authored andcommitted
ath11k: Fix napi related hang
Similar to the same bug in ath10k, a napi disable w/out it being enabled will hang forever. I believe I saw this while trying rmmod after driver had some failure on startup. Fix it by keeping state on whether napi is enabled or not. And, remove un-used napi pointer in ath11k driver base struct. Signed-off-by: Ben Greear <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 9d364b8 commit d943fda

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

drivers/net/wireless/ath/ath11k/ahb.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,11 @@ static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab)
175175

176176
ath11k_ahb_ext_grp_disable(irq_grp);
177177

178-
napi_synchronize(&irq_grp->napi);
179-
napi_disable(&irq_grp->napi);
178+
if (irq_grp->napi_enabled) {
179+
napi_synchronize(&irq_grp->napi);
180+
napi_disable(&irq_grp->napi);
181+
irq_grp->napi_enabled = false;
182+
}
180183
}
181184
}
182185

@@ -300,7 +303,10 @@ static void ath11k_ahb_ext_irq_enable(struct ath11k_base *ab)
300303
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
301304
struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
302305

303-
napi_enable(&irq_grp->napi);
306+
if (!irq_grp->napi_enabled) {
307+
napi_enable(&irq_grp->napi);
308+
irq_grp->napi_enabled = true;
309+
}
304310
ath11k_ahb_ext_grp_enable(irq_grp);
305311
}
306312
}

drivers/net/wireless/ath/ath11k/core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ struct ath11k_ext_irq_grp {
142142
u32 num_irq;
143143
u32 grp_id;
144144
u64 timestamp;
145+
bool napi_enabled;
145146
struct napi_struct napi;
146147
struct net_device napi_ndev;
147148
};
@@ -743,7 +744,6 @@ struct ath11k_base {
743744
u32 wlan_init_status;
744745
int irq_num[ATH11K_IRQ_NUM_MAX];
745746
struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX];
746-
struct napi_struct *napi;
747747
struct ath11k_targ_cap target_caps;
748748
u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE];
749749
bool pdevs_macaddr_valid;

drivers/net/wireless/ath/ath11k/pci.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -683,8 +683,11 @@ static void __ath11k_pci_ext_irq_disable(struct ath11k_base *sc)
683683

684684
ath11k_pci_ext_grp_disable(irq_grp);
685685

686-
napi_synchronize(&irq_grp->napi);
687-
napi_disable(&irq_grp->napi);
686+
if (irq_grp->napi_enabled) {
687+
napi_synchronize(&irq_grp->napi);
688+
napi_disable(&irq_grp->napi);
689+
irq_grp->napi_enabled = false;
690+
}
688691
}
689692
}
690693

@@ -712,7 +715,10 @@ static void ath11k_pci_ext_irq_enable(struct ath11k_base *ab)
712715
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
713716
struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
714717

715-
napi_enable(&irq_grp->napi);
718+
if (!irq_grp->napi_enabled) {
719+
napi_enable(&irq_grp->napi);
720+
irq_grp->napi_enabled = true;
721+
}
716722
ath11k_pci_ext_grp_enable(irq_grp);
717723
}
718724
}

0 commit comments

Comments
 (0)