On MT7927 hardware, every CLR_OWN triggers the ROM bootloader to reinitialize the WFDMA engine, destroying all DMA ring configuration (base addresses, prefetch settings, descriptor pointers). The DMA rings are already properly initialized by mt7927_dma_init() which performs a controlled CLR_OWN before ring setup. Skip the SET_OWN/CLR_OWN cycle in mt7925e_mcu_init() to preserve that configuration. Tested-by: Marcin FM Tested-by: Cristian-Florin Radoi Tested-by: George Salukvadze Tested-by: Evgeny Kapusta <3193631@gmail.com> Tested-by: Samu Toljamo Tested-by: Ariel Rosenfeld Tested-by: Chapuis Dario Tested-by: Thibaut François Tested-by: 张旭涵 Signed-off-by: Javier Tia --- drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c index 6cceff88c656..206d525eb550 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c @@ -35,13 +35,20 @@ int mt7925e_mcu_init(struct mt792x_dev *dev) dev->mt76.mcu_ops = &mt7925_mcu_ops; - err = mt792xe_mcu_fw_pmctrl(dev); - if (err) - return err; + if (is_mt7927(&dev->mt76)) { + /* MT7927: CLR_OWN was already done in mt7927_dma_init(). + * The ROM re-initializes WFDMA on every CLR_OWN, wiping + * ring and prefetch config. Skip SET_OWN/CLR_OWN here + * to preserve DMA state. */ + } else { + err = mt792xe_mcu_fw_pmctrl(dev); + if (err) + return err; - err = __mt792xe_mcu_drv_pmctrl(dev); - if (err) - return err; + err = __mt792xe_mcu_drv_pmctrl(dev); + if (err) + return err; + } mt76_rmw_field(dev, MT_PCIE_MAC_PM, MT_PCIE_MAC_PM_L0S_DIS, 1); -- 2.53.0