]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7996: remove redundant per-phy mac80211 calls during restart
authorFelix Fietkau <nbd@nbd.name>
Mon, 15 Sep 2025 07:58:56 +0000 (09:58 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 15 Sep 2025 11:23:01 +0000 (13:23 +0200)
There is only one wiphy, so extra calls must be removed.
For calls that need to remain per-wiphy, use mt7996_for_each_phy

Fixes: 69d54ce7491d ("wifi: mt76: mt7996: switch to single multi-radio wiphy")
Link: https://patch.msgid.link/20250915075910.47558-1-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index c1c4014e14753106398aa7ccf5f2e016ca05199f..f6c725f52c4a5c8d1a141e52c9f0ecef5fd075df 100644 (file)
@@ -2220,13 +2220,10 @@ void mt7996_tx_token_put(struct mt7996_dev *dev)
 static int
 mt7996_mac_restart(struct mt7996_dev *dev)
 {
-       struct mt7996_phy *phy2, *phy3;
        struct mt76_dev *mdev = &dev->mt76;
+       struct mt7996_phy *phy;
        int i, ret;
 
-       phy2 = mt7996_phy2(dev);
-       phy3 = mt7996_phy3(dev);
-
        if (dev->hif2) {
                mt76_wr(dev, MT_INT1_MASK_CSR, 0x0);
                mt76_wr(dev, MT_INT1_SOURCE_CSR, ~0);
@@ -2238,20 +2235,14 @@ mt7996_mac_restart(struct mt7996_dev *dev)
                        mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0x0);
        }
 
-       set_bit(MT76_RESET, &dev->mphy.state);
        set_bit(MT76_MCU_RESET, &dev->mphy.state);
+       mt7996_for_each_phy(dev, phy)
+               set_bit(MT76_RESET, &phy->mt76->state);
        wake_up(&dev->mt76.mcu.wait);
-       if (phy2)
-               set_bit(MT76_RESET, &phy2->mt76->state);
-       if (phy3)
-               set_bit(MT76_RESET, &phy3->mt76->state);
 
        /* lock/unlock all queues to ensure that no tx is pending */
-       mt76_txq_schedule_all(&dev->mphy);
-       if (phy2)
-               mt76_txq_schedule_all(phy2->mt76);
-       if (phy3)
-               mt76_txq_schedule_all(phy3->mt76);
+       mt7996_for_each_phy(dev, phy)
+               mt76_txq_schedule_all(phy->mt76);
 
        /* disable all tx/rx napi */
        mt76_worker_disable(&dev->mt76.tx_worker);
@@ -2335,36 +2326,25 @@ mt7996_mac_restart(struct mt7996_dev *dev)
                goto out;
 
        mt7996_mac_init(dev);
-       mt7996_init_txpower(&dev->phy);
-       mt7996_init_txpower(phy2);
-       mt7996_init_txpower(phy3);
+       mt7996_for_each_phy(dev, phy)
+               mt7996_init_txpower(phy);
        ret = mt7996_txbf_init(dev);
+       if (ret)
+               goto out;
 
-       if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state)) {
-               ret = mt7996_run(&dev->phy);
-               if (ret)
-                       goto out;
-       }
-
-       if (phy2 && test_bit(MT76_STATE_RUNNING, &phy2->mt76->state)) {
-               ret = mt7996_run(phy2);
-               if (ret)
-                       goto out;
-       }
+       mt7996_for_each_phy(dev, phy) {
+               if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state))
+                       continue;
 
-       if (phy3 && test_bit(MT76_STATE_RUNNING, &phy3->mt76->state)) {
-               ret = mt7996_run(phy3);
+               ret = mt7996_run(&dev->phy);
                if (ret)
                        goto out;
        }
 
 out:
        /* reset done */
-       clear_bit(MT76_RESET, &dev->mphy.state);
-       if (phy2)
-               clear_bit(MT76_RESET, &phy2->mt76->state);
-       if (phy3)
-               clear_bit(MT76_RESET, &phy3->mt76->state);
+       mt7996_for_each_phy(dev, phy)
+               clear_bit(MT76_RESET, &phy->mt76->state);
 
        napi_enable(&dev->mt76.tx_napi);
        local_bh_disable();
@@ -2378,26 +2358,18 @@ out:
 static void
 mt7996_mac_full_reset(struct mt7996_dev *dev)
 {
-       struct mt7996_phy *phy2, *phy3;
+       struct ieee80211_hw *hw = mt76_hw(dev);
+       struct mt7996_phy *phy;
        int i;
 
-       phy2 = mt7996_phy2(dev);
-       phy3 = mt7996_phy3(dev);
        dev->recovery.hw_full_reset = true;
 
        wake_up(&dev->mt76.mcu.wait);
-       ieee80211_stop_queues(mt76_hw(dev));
-       if (phy2)
-               ieee80211_stop_queues(phy2->mt76->hw);
-       if (phy3)
-               ieee80211_stop_queues(phy3->mt76->hw);
+       ieee80211_stop_queues(hw);
 
        cancel_work_sync(&dev->wed_rro.work);
-       cancel_delayed_work_sync(&dev->mphy.mac_work);
-       if (phy2)
-               cancel_delayed_work_sync(&phy2->mt76->mac_work);
-       if (phy3)
-               cancel_delayed_work_sync(&phy3->mt76->mac_work);
+       mt7996_for_each_phy(dev, phy)
+               cancel_delayed_work_sync(&phy->mt76->mac_work);
 
        mutex_lock(&dev->mt76.mutex);
        for (i = 0; i < 10; i++) {
@@ -2410,40 +2382,23 @@ mt7996_mac_full_reset(struct mt7996_dev *dev)
                dev_err(dev->mt76.dev, "chip full reset failed\n");
 
        ieee80211_restart_hw(mt76_hw(dev));
-       if (phy2)
-               ieee80211_restart_hw(phy2->mt76->hw);
-       if (phy3)
-               ieee80211_restart_hw(phy3->mt76->hw);
-
        ieee80211_wake_queues(mt76_hw(dev));
-       if (phy2)
-               ieee80211_wake_queues(phy2->mt76->hw);
-       if (phy3)
-               ieee80211_wake_queues(phy3->mt76->hw);
 
        dev->recovery.hw_full_reset = false;
-       ieee80211_queue_delayed_work(mt76_hw(dev),
-                                    &dev->mphy.mac_work,
-                                    MT7996_WATCHDOG_TIME);
-       if (phy2)
-               ieee80211_queue_delayed_work(phy2->mt76->hw,
-                                            &phy2->mt76->mac_work,
-                                            MT7996_WATCHDOG_TIME);
-       if (phy3)
-               ieee80211_queue_delayed_work(phy3->mt76->hw,
-                                            &phy3->mt76->mac_work,
+       mt7996_for_each_phy(dev, phy)
+               ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
                                             MT7996_WATCHDOG_TIME);
 }
 
 void mt7996_mac_reset_work(struct work_struct *work)
 {
-       struct mt7996_phy *phy2, *phy3;
+       struct ieee80211_hw *hw;
        struct mt7996_dev *dev;
+       struct mt7996_phy *phy;
        int i;
 
        dev = container_of(work, struct mt7996_dev, reset_work);
-       phy2 = mt7996_phy2(dev);
-       phy3 = mt7996_phy3(dev);
+       hw = mt76_hw(dev);
 
        /* chip full reset */
        if (dev->recovery.restart) {
@@ -2474,7 +2429,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
                return;
 
        dev_info(dev->mt76.dev,"\n%s L1 SER recovery start.",
-                wiphy_name(dev->mt76.hw->wiphy));
+                wiphy_name(hw->wiphy));
 
        if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2))
                mtk_wed_device_stop(&dev->mt76.mmio.wed_hif2);
@@ -2483,25 +2438,17 @@ void mt7996_mac_reset_work(struct work_struct *work)
                mtk_wed_device_stop(&dev->mt76.mmio.wed);
 
        ieee80211_stop_queues(mt76_hw(dev));
-       if (phy2)
-               ieee80211_stop_queues(phy2->mt76->hw);
-       if (phy3)
-               ieee80211_stop_queues(phy3->mt76->hw);
 
        set_bit(MT76_RESET, &dev->mphy.state);
        set_bit(MT76_MCU_RESET, &dev->mphy.state);
        wake_up(&dev->mt76.mcu.wait);
 
        cancel_work_sync(&dev->wed_rro.work);
-       cancel_delayed_work_sync(&dev->mphy.mac_work);
-       if (phy2) {
-               set_bit(MT76_RESET, &phy2->mt76->state);
-               cancel_delayed_work_sync(&phy2->mt76->mac_work);
-       }
-       if (phy3) {
-               set_bit(MT76_RESET, &phy3->mt76->state);
-               cancel_delayed_work_sync(&phy3->mt76->mac_work);
+       mt7996_for_each_phy(dev, phy) {
+               set_bit(MT76_RESET, &phy->mt76->state);
+               cancel_delayed_work_sync(&phy->mt76->mac_work);
        }
+
        mt76_worker_disable(&dev->mt76.tx_worker);
        mt76_for_each_q_rx(&dev->mt76, i) {
                if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
@@ -2553,11 +2500,8 @@ void mt7996_mac_reset_work(struct work_struct *work)
        }
 
        clear_bit(MT76_MCU_RESET, &dev->mphy.state);
-       clear_bit(MT76_RESET, &dev->mphy.state);
-       if (phy2)
-               clear_bit(MT76_RESET, &phy2->mt76->state);
-       if (phy3)
-               clear_bit(MT76_RESET, &phy3->mt76->state);
+       mt7996_for_each_phy(dev, phy)
+               clear_bit(MT76_RESET, &phy->mt76->state);
 
        mt76_for_each_q_rx(&dev->mt76, i) {
                if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
@@ -2579,25 +2523,14 @@ void mt7996_mac_reset_work(struct work_struct *work)
        napi_schedule(&dev->mt76.tx_napi);
        local_bh_enable();
 
-       ieee80211_wake_queues(mt76_hw(dev));
-       if (phy2)
-               ieee80211_wake_queues(phy2->mt76->hw);
-       if (phy3)
-               ieee80211_wake_queues(phy3->mt76->hw);
+       ieee80211_wake_queues(hw);
 
        mutex_unlock(&dev->mt76.mutex);
 
        mt7996_update_beacons(dev);
 
-       ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
-                                    MT7996_WATCHDOG_TIME);
-       if (phy2)
-               ieee80211_queue_delayed_work(phy2->mt76->hw,
-                                            &phy2->mt76->mac_work,
-                                            MT7996_WATCHDOG_TIME);
-       if (phy3)
-               ieee80211_queue_delayed_work(phy3->mt76->hw,
-                                            &phy3->mt76->mac_work,
+       mt7996_for_each_phy(dev, phy)
+               ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
                                             MT7996_WATCHDOG_TIME);
        dev_info(dev->mt76.dev,"\n%s L1 SER recovery completed.",
                 wiphy_name(dev->mt76.hw->wiphy));