]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: Add __mt7996_npu_hw_init routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 22 Jan 2026 10:39:56 +0000 (11:39 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 23 Mar 2026 09:23:00 +0000 (09:23 +0000)
Introduce __mt7996_npu_hw_init utility routine in order to run it
holding mt76 mutex and move NPU hw re-initialization before restarting
the NAPIs during device reset.

Tested-by: Kang Yang <kang.yang@airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20260122-mt76-npu-eagle-offload-v2-12-2374614c0de6@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mac.c
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
drivers/net/wireless/mediatek/mt76/mt7996/npu.c

index 00c6045622e3f42f8b31c62035277d7d5f6c0350..7bee97ff71df1515905303352674c6a0e403c435 100644 (file)
@@ -2569,6 +2569,8 @@ void mt7996_mac_reset_work(struct work_struct *work)
                                     MT_INT_TX_RX_DONE_EXT);
        }
 
+       __mt7996_npu_hw_init(dev);
+
        clear_bit(MT76_MCU_RESET, &dev->mphy.state);
        mt7996_for_each_phy(dev, phy)
                clear_bit(MT76_RESET, &phy->mt76->state);
@@ -2598,8 +2600,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
 
        mutex_unlock(&dev->mt76.mutex);
 
-       mt7996_npu_hw_init(dev);
-
        mt7996_for_each_phy(dev, phy)
                ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
                                             MT7996_WATCHDOG_TIME);
index c9c506e1d6edeb21d74ca2cd13e6d834a735d597..dfa338e8508b1d88f313dfc1dbbd31006f38f8a5 100644 (file)
@@ -889,10 +889,16 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
 int mt7996_dma_rro_init(struct mt7996_dev *dev);
 
 #ifdef CONFIG_MT7996_NPU
+int __mt7996_npu_hw_init(struct mt7996_dev *dev);
 int mt7996_npu_hw_init(struct mt7996_dev *dev);
 int mt7996_npu_hw_stop(struct mt7996_dev *dev);
 int mt7996_npu_rx_queues_init(struct mt7996_dev *dev);
 #else
+static inline int __mt7996_npu_hw_init(struct mt7996_dev *dev)
+{
+       return 0;
+}
+
 static inline int mt7996_npu_hw_init(struct mt7996_dev *dev)
 {
        return 0;
index c3307bbbb5473c946e0c5d0ee8f8a50dd4df57c4..0085eddc88bcaf99e284dd2e2159d898ea51e297 100644 (file)
@@ -525,20 +525,18 @@ int mt7996_npu_rx_queues_init(struct mt7996_dev *dev)
                                      &dev->mt76.q_rx[MT_RXQ_NPU1]);
 }
 
-int mt7996_npu_hw_init(struct mt7996_dev *dev)
+int __mt7996_npu_hw_init(struct mt7996_dev *dev)
 {
        struct airoha_npu *npu;
-       int i, err = 0;
-
-       mutex_lock(&dev->mt76.mutex);
+       int i, err;
 
        npu = rcu_dereference_protected(dev->mt76.mmio.npu, &dev->mt76.mutex);
        if (!npu)
-               goto unlock;
+               return 0;
 
        err = mt7996_npu_offload_init(dev, npu);
        if (err)
-               goto unlock;
+               return err;
 
        if (is_mt7996(&dev->mt76))
                err = mt7996_npu_rxd_init(dev, npu);
@@ -546,27 +544,36 @@ int mt7996_npu_hw_init(struct mt7996_dev *dev)
                err = mt7992_npu_rxd_init(dev, npu);
 
        if (err)
-               goto unlock;
+               return err;
 
        err = mt7996_npu_txd_init(dev, npu);
        if (err)
-               goto unlock;
+               return err;
 
        err = mt7996_npu_rx_event_init(dev, npu);
        if (err)
-               goto unlock;
+               return err;
 
        err = mt7996_npu_set_pcie_addr(dev, npu);
        if (err)
-               goto unlock;
+               return err;
 
        err = mt7996_npu_tx_done_init(dev, npu);
        if (err)
-               goto unlock;
+               return err;
 
        for (i = MT_RXQ_NPU0; i <= MT_RXQ_NPU1; i++)
                airoha_npu_wlan_enable_irq(npu, i - MT_RXQ_NPU0);
-unlock:
+
+       return 0;
+}
+
+int mt7996_npu_hw_init(struct mt7996_dev *dev)
+{
+       int err;
+
+       mutex_lock(&dev->mt76.mutex);
+       err = __mt7996_npu_hw_init(dev);
        mutex_unlock(&dev->mt76.mutex);
 
        return err;