mt76: mt7915: add mt7916 calibrated data support
authorBo Jiao <Bo.Jiao@mediatek.com>
Mon, 20 Dec 2021 02:18:03 +0000 (10:18 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:57:56 +0000 (13:57 +0100)
Adjust proper eeprom size and add default calibrated data support
for mt7916.

Co-developed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
Reviewed-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h

index 40dcbeb..6aa749b 100644 (file)
@@ -35,6 +35,7 @@ static int mt7915_check_eeprom(struct mt7915_dev *dev)
 
        switch (val) {
        case 0x7915:
+       case 0x7916:
                return 0;
        default:
                return -EINVAL;
@@ -52,6 +53,9 @@ mt7915_eeprom_load_default(struct mt7915_dev *dev)
        if (dev->dbdc_support)
                default_bin = MT7915_EEPROM_DEFAULT_DBDC;
 
+       if (!is_mt7915(&dev->mt76))
+               default_bin = MT7916_EEPROM_DEFAULT;
+
        ret = request_firmware(&fw, default_bin, dev->mt76.dev);
        if (ret)
                return ret;
@@ -62,7 +66,7 @@ mt7915_eeprom_load_default(struct mt7915_dev *dev)
                goto out;
        }
 
-       memcpy(eeprom, fw->data, MT7915_EEPROM_SIZE);
+       memcpy(eeprom, fw->data, mt7915_eeprom_size(dev));
        dev->flash_mode = true;
 
 out:
@@ -74,8 +78,9 @@ out:
 static int mt7915_eeprom_load(struct mt7915_dev *dev)
 {
        int ret;
+       u16 eeprom_size = mt7915_eeprom_size(dev);
 
-       ret = mt76_eeprom_init(&dev->mt76, MT7915_EEPROM_SIZE);
+       ret = mt76_eeprom_init(&dev->mt76, eeprom_size);
        if (ret < 0)
                return ret;
 
@@ -91,7 +96,7 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
                        return -EINVAL;
 
                /* read eeprom data from efuse */
-               block_num = DIV_ROUND_UP(MT7915_EEPROM_SIZE,
+               block_num = DIV_ROUND_UP(eeprom_size,
                                         MT7915_EEPROM_BLOCK_SIZE);
                for (i = 0; i < block_num; i++)
                        mt7915_mcu_get_eeprom(dev,
index 25058a5..7b917a0 100644 (file)
@@ -3574,7 +3574,8 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
 #define PAGE_IDX_MASK          GENMASK(4, 2)
 #define PER_PAGE_SIZE          0x400
        struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
-       u8 total = DIV_ROUND_UP(MT7915_EEPROM_SIZE, PER_PAGE_SIZE);
+       u16 eeprom_size = mt7915_eeprom_size(dev);
+       u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE);
        u8 *eep = (u8 *)dev->mt76.eeprom.data;
        int eep_len;
        int i;
@@ -3583,8 +3584,8 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
                struct sk_buff *skb;
                int ret;
 
-               if (i == total - 1 && !!(MT7915_EEPROM_SIZE % PER_PAGE_SIZE))
-                       eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE;
+               if (i == total - 1 && !!(eeprom_size % PER_PAGE_SIZE))
+                       eep_len = eeprom_size % PER_PAGE_SIZE;
                else
                        eep_len = PER_PAGE_SIZE;
 
index 0066776..f1c4636 100644 (file)
 
 #define MT7915_EEPROM_DEFAULT          "mediatek/mt7915_eeprom.bin"
 #define MT7915_EEPROM_DEFAULT_DBDC     "mediatek/mt7915_eeprom_dbdc.bin"
+#define MT7916_EEPROM_DEFAULT          "mediatek/mt7916_eeprom.bin"
 
 #define MT7915_EEPROM_SIZE             3584
+#define MT7916_EEPROM_SIZE             4096
+
 #define MT7915_EEPROM_BLOCK_SIZE       16
 #define MT7915_TOKEN_SIZE              8192
 
@@ -486,6 +489,11 @@ static inline u16 mt7915_wtbl_size(struct mt7915_dev *dev)
        return is_mt7915(&dev->mt76) ? MT7915_WTBL_SIZE : MT7916_WTBL_SIZE;
 }
 
+static inline u16 mt7915_eeprom_size(struct mt7915_dev *dev)
+{
+       return is_mt7915(&dev->mt76) ? MT7915_EEPROM_SIZE : MT7916_EEPROM_SIZE;
+}
+
 void mt7915_dual_hif_set_irq_mask(struct mt7915_dev *dev, bool write_reg,
                                  u32 clear, u32 set);