summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/ath/ath10k/pci.c
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2014-08-28 10:24:40 +0200
committerKalle Valo <kvalo@qca.qualcomm.com>2014-09-02 10:18:36 +0300
commit2139627172429baee9d62696c6923ce5dc7052bc (patch)
tree630bb28c3c3f261b5afa82aaed6e7602b3d685a3 /drivers/net/wireless/ath/ath10k/pci.c
parenta4841eb6392e14a5070e633de30637342f6578d2 (diff)
downloadlwn-2139627172429baee9d62696c6923ce5dc7052bc.tar.gz
lwn-2139627172429baee9d62696c6923ce5dc7052bc.zip
ath10k: kill tasklets after free_irq
Commit 5c771e7454d148af35e8b4297d00f880de79ea49 introduced a regression. On some systems spurious interrupts could schedule a tasklet while tearing down leading to, e.g.: BUG: unable to handle kernel paging request at fe589030 IP: [<c1316fb0>] ioread32+0x30/0x40 ... Call Trace: [<fe576c1b>] ath10k_pci_tasklet+0x1b/0x60 [ath10k_pci] [<c1053fbe>] tasklet_action+0x9e/0xb0 [<c10534f1>] __do_softirq+0xf1/0x3f0 [<c1053400>] ? ftrace_raw_event_irq_handler_entry+0xa0/0xa0 [<c1004999>] do_softirq_own_stack+0x29/0x40 <IRQ> [<c1053a76>] irq_exit+0x86/0xb0 ... [<c132d522>] do_pci_disable_device+0x52/0x60 [<c132d57f>] pci_disable_device+0x4f/0xb0 [<c132a961>] ? __pci_set_master+0x51/0x80 [<fe5740b3>] ath10k_pci_release+0x33/0x40 [ath10k_pci] [<fe575d4b>] ath10k_pci_remove+0x7b/0x90 [ath10k_pci] Reported-by: Kalle Valo <kvalo@qca.qualcomm.com> Tested-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/pci.c')
-rw-r--r--drivers/net/wireless/ath/ath10k/pci.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 6abe9394e8d7..3c7abca0156e 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -2547,6 +2547,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
err_free_irq:
ath10k_pci_free_irq(ar);
+ ath10k_pci_kill_tasklet(ar);
err_deinit_irq:
ath10k_pci_deinit_irq(ar);
@@ -2583,6 +2584,7 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
ath10k_core_unregister(ar);
ath10k_pci_free_irq(ar);
+ ath10k_pci_kill_tasklet(ar);
ath10k_pci_deinit_irq(ar);
ath10k_pci_ce_deinit(ar);
ath10k_pci_free_ce(ar);