wifi: mt76: connac: add firmware support for mt7992
authorStanleyYP Wang <StanleyYP.Wang@mediatek.com>
Mon, 13 Nov 2023 07:06:13 +0000 (15:06 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 7 Dec 2023 17:50:22 +0000 (18:50 +0100)
Support firmware download and enable related AFE PLL for mt7992 chipsets.
This is a preliminary patch for mt7992 chipsets support.

Co-developed-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
Co-developed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac.h
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
drivers/net/wireless/mediatek/mt76/mt7996/init.c
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
drivers/net/wireless/mediatek/mt76/mt7996/pci.c
drivers/net/wireless/mediatek/mt76/mt7996/regs.h

index e5ebde19af8f6fdadf5de4fa1aa9cde93f619fac..fdde3d70b300e365856156cea56037c18eef0fd3 100644 (file)
@@ -222,6 +222,11 @@ static inline bool is_mt7996(struct mt76_dev *dev)
        return mt76_chip(dev) == 0x7990;
 }
 
+static inline bool is_mt7992(struct mt76_dev *dev)
+{
+       return mt76_chip(dev) == 0x7992;
+}
+
 static inline bool is_mt7622(struct mt76_dev *dev)
 {
        if (!IS_ENABLED(CONFIG_MT7622_WMAC))
index b475555097ff2f1d5c49bdd6fbeb68f3f0089b52..96494ba2fdf767ba89d25b505ca7ee86b0797c19 100644 (file)
@@ -67,7 +67,8 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
        if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
            (is_mt7921(dev) && addr == 0x900000) ||
            (is_mt7925(dev) && addr == 0x900000) ||
-           (is_mt7996(dev) && addr == 0x900000))
+           (is_mt7996(dev) && addr == 0x900000) ||
+           (is_mt7992(dev) && addr == 0x900000))
                cmd = MCU_CMD(PATCH_START_REQ);
        else
                cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
index 64fa2f28c8c24d4118f54779c366aca98cdfc159..2a7c367afae16047edaf9b889871fd3edc7b2a19 100644 (file)
@@ -888,6 +888,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
        int ret, idx;
 
        mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
+       if (is_mt7992(&dev->mt76)) {
+               mt76_rmw(dev, MT_AFE_CTL_BAND_PLL_03(MT_BAND0), MT_AFE_CTL_BAND_PLL_03_MSB_EN, 0);
+               mt76_rmw(dev, MT_AFE_CTL_BAND_PLL_03(MT_BAND1), MT_AFE_CTL_BAND_PLL_03_MSB_EN, 0);
+       }
 
        INIT_WORK(&dev->init_work, mt7996_init_work);
        INIT_WORK(&dev->wed_rro.work, mt7996_wed_rro_work);
index be4beeb47a19d357bc7be013ad11b9409861eb08..3c729b563edc5dd6f964e0e72c46f276367c3d65 100644 (file)
 #include "mac.h"
 #include "eeprom.h"
 
+#define fw_name(_dev, name, ...)       ({                      \
+       char *_fw;                                              \
+       switch (mt76_chip(&(_dev)->mt76)) {                     \
+       case 0x7992:                                            \
+               _fw = MT7992_##name;                            \
+               break;                                          \
+       case 0x7990:                                            \
+       default:                                                \
+               _fw = MT7996_##name;                            \
+               break;                                          \
+       }                                                       \
+       _fw;                                                    \
+})
+
 struct mt7996_patch_hdr {
        char build_date[16];
        char platform[4];
@@ -2639,7 +2653,7 @@ static int mt7996_load_patch(struct mt7996_dev *dev)
                return -EAGAIN;
        }
 
-       ret = request_firmware(&fw, MT7996_ROM_PATCH, dev->mt76.dev);
+       ret = request_firmware(&fw, fw_name(dev, ROM_PATCH), dev->mt76.dev);
        if (ret)
                goto out;
 
@@ -2802,17 +2816,17 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
 {
        int ret;
 
-       ret = __mt7996_load_ram(dev, "WM", MT7996_FIRMWARE_WM,
+       ret = __mt7996_load_ram(dev, "WM", fw_name(dev, FIRMWARE_WM),
                                MT7996_RAM_TYPE_WM);
        if (ret)
                return ret;
 
-       ret = __mt7996_load_ram(dev, "DSP", MT7996_FIRMWARE_DSP,
+       ret = __mt7996_load_ram(dev, "DSP", fw_name(dev, FIRMWARE_DSP),
                                MT7996_RAM_TYPE_DSP);
        if (ret)
                return ret;
 
-       return __mt7996_load_ram(dev, "WA", MT7996_FIRMWARE_WA,
+       return __mt7996_load_ram(dev, "WA", fw_name(dev, FIRMWARE_WA),
                                 MT7996_RAM_TYPE_WA);
 }
 
index aefd09c7d6e65947884f62112a840860586905ca..1a36ef50f6e16ab696c22ea24a68370fb28ce4fd 100644 (file)
 #define MT7996_FIRMWARE_DSP            "mediatek/mt7996/mt7996_dsp.bin"
 #define MT7996_ROM_PATCH               "mediatek/mt7996/mt7996_rom_patch.bin"
 
+#define MT7992_FIRMWARE_WA             "mediatek/mt7996/mt7992_wa.bin"
+#define MT7992_FIRMWARE_WM             "mediatek/mt7996/mt7992_wm.bin"
+#define MT7992_FIRMWARE_DSP            "mediatek/mt7996/mt7992_dsp.bin"
+#define MT7992_ROM_PATCH               "mediatek/mt7996/mt7992_rom_patch.bin"
+
 #define MT7996_EEPROM_DEFAULT          "mediatek/mt7996/mt7996_eeprom.bin"
 #define MT7996_EEPROM_SIZE             7680
 #define MT7996_EEPROM_BLOCK_SIZE       16
index 93ecc9a8dde07c7bc7092fef053c60927dae7f8d..baa5fb97a121cb93a895c144cbe069321da96c57 100644 (file)
@@ -244,3 +244,7 @@ MODULE_FIRMWARE(MT7996_FIRMWARE_WA);
 MODULE_FIRMWARE(MT7996_FIRMWARE_WM);
 MODULE_FIRMWARE(MT7996_FIRMWARE_DSP);
 MODULE_FIRMWARE(MT7996_ROM_PATCH);
+MODULE_FIRMWARE(MT7992_FIRMWARE_WA);
+MODULE_FIRMWARE(MT7992_FIRMWARE_WM);
+MODULE_FIRMWARE(MT7992_FIRMWARE_DSP);
+MODULE_FIRMWARE(MT7992_ROM_PATCH);
index d8904cbc2856d33c4a8ddf06c69ef15a25ac64db..aee577d90ddb10bb77c86bb1476cff44029dc58d 100644 (file)
@@ -683,4 +683,11 @@ enum base_rev {
 #define MT_MCU_WM_EXCP_LR_CTRL                 MT_MCU_WM_EXCP(0x200)
 #define MT_MCU_WM_EXCP_LR_LOG                  MT_MCU_WM_EXCP(0x204)
 
+/* CONN AFE CTL CON */
+#define MT_AFE_CTL_BASE                                0x18043000
+#define MT_AFE_CTL_BAND(_band, ofs)            (MT_AFE_CTL_BASE + \
+                                                ((_band) * 0x1000) + (ofs))
+#define MT_AFE_CTL_BAND_PLL_03(_band)          MT_AFE_CTL_BAND(_band, 0x2c)
+#define MT_AFE_CTL_BAND_PLL_03_MSB_EN          BIT(1)
+
 #endif