summarylogtreecommitdiffstats
path: root/sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch')
-rw-r--r--sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch221
1 files changed, 221 insertions, 0 deletions
diff --git a/sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch b/sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch
new file mode 100644
index 000000000000..d11143822c5f
--- /dev/null
+++ b/sys-kernel_arch-sources-g14_files-8016-mt76-mt7921-Add-mt7922-support.patch
@@ -0,0 +1,221 @@
+From ad4ffe33fd9d517ef27e213c6bd9d11675658fe2 Mon Sep 17 00:00:00 2001
+From: Deren Wu <deren.wu@mediatek.com>
+Date: Fri, 16 Jul 2021 01:34:19 +0800
+Subject: [PATCH 8014/8014] mt76: mt7921: Add mt7922 support
+
+Add new chip mt7922 in mt7921 module with following items
+1. new chip ID / fw bin name
+2. is_mt7922()
+ check chip type for different fw files
+3. mt7921_get_data_mode()
+ check security type of fw (backward compatible)
+
+Co-developed-by: Jimmy Hu <Jimmy.Hu@mediatek.com>
+Signed-off-by: Jimmy Hu <Jimmy.Hu@mediatek.com>
+Signed-off-by: Deren Wu <deren.wu@mediatek.com>
+---
+ .../net/wireless/mediatek/mt76/mt76_connac.h | 7 +-
+ .../wireless/mediatek/mt76/mt7921/eeprom.c | 1 +
+ .../net/wireless/mediatek/mt76/mt7921/mcu.c | 71 +++++++++++++++++--
+ .../wireless/mediatek/mt76/mt7921/mt7921.h | 3 +
+ .../net/wireless/mediatek/mt76/mt7921/pci.c | 3 +
+ 5 files changed, 80 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+index 6c889b90fd12..f6e7671fc3be 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
++++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+@@ -82,9 +82,14 @@ struct mt76_connac_coredump {
+
+ extern const struct wiphy_wowlan_support mt76_connac_wowlan_support;
+
++static inline bool is_mt7922(struct mt76_dev *dev)
++{
++ return mt76_chip(dev) == 0x7922;
++}
++
+ static inline bool is_mt7921(struct mt76_dev *dev)
+ {
+- return mt76_chip(dev) == 0x7961;
++ return mt76_chip(dev) == 0x7961 || is_mt7922(dev);
+ }
+
+ static inline bool is_mt7663(struct mt76_dev *dev)
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
+index 691d14a1a7bf..4d0a4aeac6bf 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
+@@ -36,6 +36,7 @@ static int mt7921_check_eeprom(struct mt7921_dev *dev)
+ val = get_unaligned_le16(eeprom);
+
+ switch (val) {
++ case 0x7922:
+ case 0x7961:
+ return 0;
+ default:
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+index bc8e3327a49f..798ddfde205a 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+@@ -82,9 +82,17 @@ struct mt7921_fw_region {
+ #define FW_START_OVERRIDE BIT(0)
+ #define FW_START_WORKING_PDA_CR4 BIT(2)
+
++#define PATCH_SEC_NOT_SUPPORT GENMASK(31, 0)
+ #define PATCH_SEC_TYPE_MASK GENMASK(15, 0)
+ #define PATCH_SEC_TYPE_INFO 0x2
+
++#define PATCH_SEC_ENC_TYPE_MASK GENMASK(31, 24)
++#define PATCH_SEC_ENC_TYPE_PLAIN 0x00
++#define PATCH_SEC_ENC_TYPE_AES 0x01
++#define PATCH_SEC_ENC_TYPE_SCRAMBLE 0x02
++#define PATCH_SEC_ENC_SCRAMBLE_INFO_MASK GENMASK(15, 0)
++#define PATCH_SEC_ENC_AES_KEY_MASK GENMASK(7, 0)
++
+ #define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id)
+ #define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id)
+
+@@ -722,6 +730,46 @@ static int mt7921_driver_own(struct mt7921_dev *dev)
+ return 0;
+ }
+
++static u32 mt7921_get_data_mode(struct mt7921_dev *dev, u32 info)
++{
++ u32 mode = DL_MODE_NEED_RSP;
++
++ if (info == PATCH_SEC_NOT_SUPPORT)
++ return mode;
++
++ switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
++ case PATCH_SEC_ENC_TYPE_PLAIN:
++ break;
++ case PATCH_SEC_ENC_TYPE_AES:
++ mode |= DL_MODE_ENCRYPT;
++ mode |= FIELD_PREP(DL_MODE_KEY_IDX,
++ (info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX;
++ mode |= DL_MODE_RESET_SEC_IV;
++ break;
++ case PATCH_SEC_ENC_TYPE_SCRAMBLE:
++ mode |= DL_MODE_ENCRYPT;
++ mode |= DL_CONFIG_ENCRY_MODE_SEL;
++ mode |= DL_MODE_RESET_SEC_IV;
++ break;
++ default:
++ dev_err(dev->mt76.dev, "Encryption type not support!\n");
++ }
++
++ return mode;
++}
++
++static char *mt7921_patch_name(struct mt7921_dev *dev)
++{
++ char *ret;
++
++ if (is_mt7922(&dev->mt76))
++ ret = MT7922_ROM_PATCH;
++ else
++ ret = MT7921_ROM_PATCH;
++
++ return ret;
++}
++
+ static int mt7921_load_patch(struct mt7921_dev *dev)
+ {
+ const struct mt7921_patch_hdr *hdr;
+@@ -739,7 +787,7 @@ static int mt7921_load_patch(struct mt7921_dev *dev)
+ return -EAGAIN;
+ }
+
+- ret = request_firmware(&fw, MT7921_ROM_PATCH, dev->mt76.dev);
++ ret = request_firmware(&fw, mt7921_patch_name(dev), dev->mt76.dev);
+ if (ret)
+ goto out;
+
+@@ -757,7 +805,8 @@ static int mt7921_load_patch(struct mt7921_dev *dev)
+ for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
+ struct mt7921_patch_sec *sec;
+ const u8 *dl;
+- u32 len, addr;
++ u32 len, addr, mode;
++ u32 sec_info = 0;
+
+ sec = (struct mt7921_patch_sec *)(fw->data + sizeof(*hdr) +
+ i * sizeof(*sec));
+@@ -770,9 +819,11 @@ static int mt7921_load_patch(struct mt7921_dev *dev)
+ addr = be32_to_cpu(sec->info.addr);
+ len = be32_to_cpu(sec->info.len);
+ dl = fw->data + be32_to_cpu(sec->offs);
++ sec_info = be32_to_cpu(sec->info.sec_key_idx);
++ mode = mt7921_get_data_mode(dev, sec_info);
+
+ ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
+- DL_MODE_NEED_RSP);
++ mode);
+ if (ret) {
+ dev_err(dev->mt76.dev, "Download request failed\n");
+ goto out;
+@@ -869,13 +920,25 @@ mt7921_mcu_send_ram_firmware(struct mt7921_dev *dev,
+ return mt76_connac_mcu_start_firmware(&dev->mt76, override, option);
+ }
+
++static char *mt7921_ram_name(struct mt7921_dev *dev)
++{
++ char *ret;
++
++ if (is_mt7922(&dev->mt76))
++ ret = MT7922_FIRMWARE_WM;
++ else
++ ret = MT7921_FIRMWARE_WM;
++
++ return ret;
++}
++
+ static int mt7921_load_ram(struct mt7921_dev *dev)
+ {
+ const struct mt7921_fw_trailer *hdr;
+ const struct firmware *fw;
+ int ret;
+
+- ret = request_firmware(&fw, MT7921_FIRMWARE_WM, dev->mt76.dev);
++ ret = request_firmware(&fw, mt7921_ram_name(dev), dev->mt76.dev);
+ if (ret)
+ return ret;
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+index 59862ea4951c..d8e616229e9f 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+@@ -33,6 +33,9 @@
+ #define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin"
+ #define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin"
+
++#define MT7922_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7922_1.bin"
++#define MT7922_ROM_PATCH "mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin"
++
+ #define MT7921_EEPROM_SIZE 3584
+ #define MT7921_TOKEN_SIZE 8192
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+index fa02d934f0bf..684d0568a92a 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+@@ -14,6 +14,7 @@
+
+ static const struct pci_device_id mt7921_pci_device_table[] = {
+ { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7961) },
++ { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7922) },
+ { },
+ };
+
+@@ -317,6 +318,8 @@ module_pci_driver(mt7921_pci_driver);
+ MODULE_DEVICE_TABLE(pci, mt7921_pci_device_table);
+ MODULE_FIRMWARE(MT7921_FIRMWARE_WM);
+ MODULE_FIRMWARE(MT7921_ROM_PATCH);
++MODULE_FIRMWARE(MT7922_FIRMWARE_WM);
++MODULE_FIRMWARE(MT7922_ROM_PATCH);
+ MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
+ MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
+ MODULE_LICENSE("Dual BSD/GPL");
+--
+2.32.0
+