mt76: mt7915: always call mt7915_wfsys_reset() during init
authorRyder Lee <ryder.lee@mediatek.com>
Sat, 19 Mar 2022 04:53:50 +0000 (12:53 +0800)
committerFelix Fietkau <nbd@nbd.name>
Fri, 13 May 2022 07:39:34 +0000 (09:39 +0200)
Soft reboot might not clear certain condition, so always call
mt7915_wfsys_reset() during init.

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/init.c
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
drivers/net/wireless/mediatek/mt76/mt7915/pci.c
drivers/net/wireless/mediatek/mt76/mt7915/soc.c

index 9686a83..aa93aea 100644 (file)
@@ -564,7 +564,7 @@ static void mt7915_init_work(struct work_struct *work)
        mt7915_txbf_init(dev);
 }
 
-static void mt7915_wfsys_reset(struct mt7915_dev *dev)
+void mt7915_wfsys_reset(struct mt7915_dev *dev)
 {
 #define MT_MCU_DUMMY_RANDOM    GENMASK(15, 0)
 #define MT_MCU_DUMMY_DEFAULT   GENMASK(31, 16)
@@ -653,11 +653,6 @@ mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2)
 
        INIT_WORK(&dev->init_work, mt7915_init_work);
 
-       /* If MCU was already running, it is likely in a bad state */
-       if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) >
-           FW_STATE_FW_DOWNLOAD)
-               mt7915_wfsys_reset(dev);
-
        ret = mt7915_dma_init(dev, phy2);
        if (ret)
                return ret;
@@ -665,14 +660,8 @@ mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2)
        set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);
 
        ret = mt7915_mcu_init(dev);
-       if (ret) {
-               /* Reset and try again */
-               mt7915_wfsys_reset(dev);
-
-               ret = mt7915_mcu_init(dev);
-               if (ret)
-                       return ret;
-       }
+       if (ret)
+               return ret;
 
        ret = mt7915_eeprom_init(dev);
        if (ret < 0)
index fd05e07..ca129e5 100644 (file)
@@ -429,6 +429,7 @@ static inline void mt7986_wmac_disable(struct mt7915_dev *dev)
 #endif
 struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
                                     void __iomem *mem_base, u32 device_id);
+void mt7915_wfsys_reset(struct mt7915_dev *dev);
 irqreturn_t mt7915_irq_handler(int irq, void *dev_instance);
 u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif);
 int mt7915_register_device(struct mt7915_dev *dev);
index 6f819c4..1bab1cb 100644 (file)
@@ -126,6 +126,7 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
                return PTR_ERR(dev);
 
        mdev = &dev->mt76;
+       mt7915_wfsys_reset(dev);
        hif2 = mt7915_pci_init_hif2(pdev);
 
        ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
index 3028c02..52fc5d5 100644 (file)
@@ -1128,7 +1128,7 @@ static int mt7986_wmac_init(struct mt7915_dev *dev)
        if (IS_ERR(dev->rstc))
                return PTR_ERR(dev->rstc);
 
-       return mt7986_wmac_enable(dev);
+       return 0;
 }
 
 static int mt7986_wmac_probe(struct platform_device *pdev)
@@ -1161,12 +1161,13 @@ static int mt7986_wmac_probe(struct platform_device *pdev)
        if (ret)
                goto free_device;
 
-       mt76_wr(dev, MT_INT_MASK_CSR, 0);
-
        ret = mt7986_wmac_init(dev);
        if (ret)
                goto free_irq;
 
+       mt7915_wfsys_reset(dev);
+       mt76_wr(dev, MT_INT_MASK_CSR, 0);
+
        ret = mt7915_register_device(dev);
        if (ret)
                goto free_irq;