Skip to content

Commit 41130c3

Browse files
LorenzoBianconiKalle Valo
authored andcommitted
wifi: mt76: do not run mt76_unregister_device() on unregistered hw
Trying to probe a mt7921e pci card without firmware results in a successful probe where ieee80211_register_hw hasn't been called. When removing the driver, ieee802111_unregister_hw is called unconditionally leading to a kernel NULL pointer dereference. Fix the issue running mt76_unregister_device routine just for registered hw. Link: https://bugs.debian.org/1029116 Link: https://bugs.kali.org/view.php?id=8140 Reported-by: Stuart Hayhurst <[email protected]> Fixes: 1c71e03 ("mt76: mt7921: move mt7921_init_hw in a dedicated work") Tested-by: Helmut Grohne <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/be3457d82f4e44bb71a22b2b5db27b644a37b1e1.1677107277.git.lorenzo@kernel.org
1 parent 96c0695 commit 41130c3

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

drivers/net/wireless/mediatek/mt76/mac80211.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht,
539539
if (ret)
540540
return ret;
541541

542+
set_bit(MT76_STATE_REGISTERED, &phy->state);
542543
phy->dev->phys[phy->band_idx] = phy;
543544

544545
return 0;
@@ -549,6 +550,9 @@ void mt76_unregister_phy(struct mt76_phy *phy)
549550
{
550551
struct mt76_dev *dev = phy->dev;
551552

553+
if (!test_bit(MT76_STATE_REGISTERED, &phy->state))
554+
return;
555+
552556
if (IS_ENABLED(CONFIG_MT76_LEDS))
553557
mt76_led_cleanup(phy);
554558
mt76_tx_status_check(dev, true);
@@ -719,6 +723,7 @@ int mt76_register_device(struct mt76_dev *dev, bool vht,
719723
return ret;
720724

721725
WARN_ON(mt76_worker_setup(hw, &dev->tx_worker, NULL, "tx"));
726+
set_bit(MT76_STATE_REGISTERED, &phy->state);
722727
sched_set_fifo_low(dev->tx_worker.task);
723728

724729
return 0;
@@ -729,6 +734,9 @@ void mt76_unregister_device(struct mt76_dev *dev)
729734
{
730735
struct ieee80211_hw *hw = dev->hw;
731736

737+
if (!test_bit(MT76_STATE_REGISTERED, &dev->phy.state))
738+
return;
739+
732740
if (IS_ENABLED(CONFIG_MT76_LEDS))
733741
mt76_led_cleanup(&dev->phy);
734742
mt76_tx_status_check(dev, true);

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ struct mt76_tx_cb {
402402

403403
enum {
404404
MT76_STATE_INITIALIZED,
405+
MT76_STATE_REGISTERED,
405406
MT76_STATE_RUNNING,
406407
MT76_STATE_MCU_RUNNING,
407408
MT76_SCANNING,

0 commit comments

Comments
 (0)