From: greearb@candelatech.com
To: linux-wireless@vger.kernel.org
Cc: Ben Greear <greearb@candelatech.com>
Subject: [RFC 2/2] wifi: mt76: mt7996: Clean up IRQ on module unload.
Date: Wed, 16 Sep 2026 13:47:50 -0700 [thread overview]
Message-ID: <20260916204750.1439984-2-greearb@candelatech.com> (raw)
In-Reply-To: <20260916204750.1439984-1-greearb@candelatech.com>
From: Ben Greear <greearb@candelatech.com>
When removing mt7996e module, softirqd would go to 100%
cpu usage. It appears the problem is lack of cleanup of
the irq objects and proper kill of the irq_tasklet.
Clean these up, similar to how the error cleanup path works
in mt7996_pci_probe.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
NOTE: Tested in 7.2 + modifications kernel, but applies and compiles
against 7.3 linus tree. Not tested there at this point.
drivers/net/wireless/mediatek/mt76/mt7996/init.c | 16 +++++++++++++++-
.../net/wireless/mediatek/mt76/mt7996/mt7996.h | 1 +
drivers/net/wireless/mediatek/mt76/mt7996/pci.c | 11 +++++++++--
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index fb635a092584..45fc76cecd04 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -1807,6 +1807,18 @@ int mt7996_register_device(struct mt7996_dev *dev)
return ret;
}
+static void mt7996_cleanup_irqs(struct mt7996_dev *dev)
+{
+ struct mt76_dev *mdev = &dev->mt76;
+ struct pci_dev *pdev = to_pci_dev(mdev->dev);
+
+ mt7996_put_hif2(dev, dev->hif2); /* frees hif2 irq */
+
+ devm_free_irq(mdev->dev, pdev->irq, dev);
+ if (!mtk_wed_device_active(&dev->mt76.mmio.wed))
+ pci_free_irq_vectors(pdev);
+}
+
void mt7996_unregister_device(struct mt7996_dev *dev)
{
cancel_work_sync(&dev->dump_work);
@@ -1825,7 +1837,9 @@ void mt7996_unregister_device(struct mt7996_dev *dev)
if (mt7996_has_hwrro(dev) &&
!mtk_wed_device_active(&dev->mt76.mmio.wed))
mt7996_rro_msdu_page_map_free(dev);
- tasklet_disable(&dev->mt76.irq_tasklet);
+ tasklet_kill(&dev->mt76.irq_tasklet);
+
+ mt7996_cleanup_irqs(dev);
mt76_free_device(&dev->mt76);
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 2a0cdb56f822..79c57e88e107 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -678,6 +678,7 @@ irqreturn_t mt7996_irq_handler(int irq, void *dev_instance);
u64 __mt7996_get_tsf(struct ieee80211_hw *hw, struct mt7996_vif_link *link);
int mt7996_register_device(struct mt7996_dev *dev);
void mt7996_unregister_device(struct mt7996_dev *dev);
+void mt7996_put_hif2(struct mt7996_dev *dev, struct mt7996_hif *hif);
int mt7996_vif_link_add(struct mt76_phy *mphy, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *link_conf,
struct mt76_vif_link *mlink);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
index b7d9193e042f..5c686cf66d0a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/pci.c
@@ -53,11 +53,19 @@ static struct mt7996_hif *mt7996_pci_get_hif2(u32 idx)
return hif;
}
-static void mt7996_put_hif2(struct mt7996_hif *hif)
+void mt7996_put_hif2(struct mt7996_dev *dev, struct mt7996_hif *hif)
{
+ struct pci_dev *hif2_dev;
+
if (!hif)
return;
+ hif2_dev = container_of(hif->dev, struct pci_dev, dev);
+
+ devm_free_irq(dev->mt76.dev, hif->irq, dev);
+ if (!mtk_wed_device_active(&dev->mt76.mmio.wed_hif2))
+ pci_free_irq_vectors(hif2_dev);
+
put_device(hif->dev);
}
@@ -237,7 +245,6 @@ static void mt7996_pci_remove(struct pci_dev *pdev)
mdev = pci_get_drvdata(pdev);
dev = container_of(mdev, struct mt7996_dev, mt76);
- mt7996_put_hif2(dev->hif2);
mt7996_unregister_device(dev);
}
--
2.42.0
next prev parent reply other threads:[~2026-09-16 20:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-16 20:47 [RFC 1/2] wifi: mt76: disable NAPI before deleting in dma_cleanup greearb
2026-09-16 20:47 ` greearb [this message]
2026-09-18 11:04 ` Shiji Yang
2026-09-18 15:22 ` Ben Greear
2026-09-20 3:49 ` Devin Wittmayer
2026-09-20 14:49 ` Ben Greear
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260916204750.1439984-2-greearb@candelatech.com \
--to=greearb@candelatech.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.