]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt792x: fix mt7925u USB WFSYS reset handling
authorSean Wang <sean.wang@mediatek.com>
Wed, 11 Mar 2026 00:28:25 +0000 (19:28 -0500)
committerFelix Fietkau <nbd@nbd.name>
Tue, 24 Mar 2026 15:49:31 +0000 (15:49 +0000)
mt7925u uses different reset/status registers from mt7921u. Reusing the
mt7921u register set causes the WFSYS reset to fail.

Add a chip-specific descriptor in mt792xu_wfsys_reset() to select the
correct registers and fix mt7925u failing to initialize after a warm
reboot.

Fixes: d28e1a48952e ("wifi: mt76: mt792x: introduce mt792x-usb module")
Cc: stable@vger.kernel.org
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20260311002825.15502-2-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt792x_regs.h
drivers/net/wireless/mediatek/mt76/mt792x_usb.c

index 7ddde92868611ad059575b8fcf27b528c0ea4268..d2a8b2b0df32cdaf770c8a8abfe8c7e8bfe01683 100644 (file)
 #define MT_CBTOP_RGU_WF_SUBSYS_RST     MT_CBTOP_RGU(0x600)
 #define MT_CBTOP_RGU_WF_SUBSYS_RST_WF_WHOLE_PATH BIT(0)
 
+#define MT7925_CBTOP_RGU_WF_SUBSYS_RST 0x70028600
+#define MT7925_WFSYS_INIT_DONE_ADDR    0x184c1604
+#define MT7925_WFSYS_INIT_DONE         0x00001d1e
+
 #define MT_HW_BOUND                    0x70010020
 #define MT_HW_CHIPID                   0x70010200
 #define MT_HW_REV                      0x70010204
index a92e872226cfe977b214a46150738a5f515d1e95..47827d1c5ccb1267b9896edd1fa6356381ef6d11 100644 (file)
@@ -224,6 +224,15 @@ static const struct mt792xu_wfsys_desc mt7921_wfsys_desc = {
        .need_status_sel = true,
 };
 
+static const struct mt792xu_wfsys_desc mt7925_wfsys_desc = {
+       .rst_reg = MT7925_CBTOP_RGU_WF_SUBSYS_RST,
+       .done_reg = MT7925_WFSYS_INIT_DONE_ADDR,
+       .done_mask = U32_MAX,
+       .done_val = MT7925_WFSYS_INIT_DONE,
+       .delay_ms = 20,
+       .need_status_sel = false,
+};
+
 int mt792xu_dma_init(struct mt792x_dev *dev, bool resume)
 {
        int err;
@@ -254,7 +263,9 @@ EXPORT_SYMBOL_GPL(mt792xu_dma_init);
 
 int mt792xu_wfsys_reset(struct mt792x_dev *dev)
 {
-       const struct mt792xu_wfsys_desc *desc = &mt7921_wfsys_desc;
+       const struct mt792xu_wfsys_desc *desc = is_mt7925(&dev->mt76) ?
+                                               &mt7925_wfsys_desc :
+                                               &mt7921_wfsys_desc;
        u32 val;
        int i;