mt76: mt7615: add starec operating flow for firmware v2
authorRyder Lee <ryder.lee@mediatek.com>
Sat, 1 Feb 2020 15:33:49 +0000 (23:33 +0800)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:08 +0000 (10:06 +0100)
Add fw_ver in mt7615_dev to check firmware version, and adjust
mt7615_mcu_send_sta_rec() to adapt firmware v2 changes.

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Tested-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

index 90ff69610c417038dc516c1855f400ca66c7ecae..9cebf5797fcf229d4b03b49a73a919762218a855 100644 (file)
@@ -551,6 +551,11 @@ static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
                 sizeof(dev->mt76.hw->wiphy->fw_version),
                 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
 
+       if (!strncmp(hdr->fw_ver, "2.0", sizeof(hdr->fw_ver)))
+               dev->fw_ver = MT7615_FIRMWARE_V2;
+       else
+               dev->fw_ver = MT7615_FIRMWARE_V1;
+
 out:
        release_firmware(fw);
        return ret;
@@ -1121,10 +1126,11 @@ static int
 mt7615_mcu_send_sta_rec(struct mt7615_dev *dev, u8 *req, u8 *wreq,
                        u8 wlen, bool enable)
 {
-       u32 slen = wreq - req;
+       bool is_v1 = (dev->fw_ver == MT7615_FIRMWARE_V1);
+       u32 slen = is_v1 ? wreq - req : wreq - req + wlen;
        int ret;
 
-       if (!enable) {
+       if (is_v1 && !enable) {
                ret = __mt76_mcu_send_msg(&dev->mt76,
                                          MCU_EXT_CMD_STA_REC_UPDATE,
                                          req, slen, true);
@@ -1135,10 +1141,12 @@ mt7615_mcu_send_sta_rec(struct mt7615_dev *dev, u8 *req, u8 *wreq,
                                           wreq, wlen, true);
        }
 
-       ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE, wreq,
-                                 wlen, true);
-       if (ret)
-               return ret;
+       if (is_v1) {
+               ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE,
+                                         wreq, wlen, true);
+               if (ret)
+                       return ret;
+       }
 
        return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_STA_REC_UPDATE,
                                   req, slen, true);
index 688d452616969a021ebdea0ee7df31621ff2211a..2ecfddbd5ad47df45716a45e57f971b874d87e88 100644 (file)
@@ -36,6 +36,9 @@
 #define MT7622_FIRMWARE_N9             "mediatek/mt7622_n9.bin"
 #define MT7622_ROM_PATCH               "mediatek/mt7622_rom_patch.bin"
 
+#define MT7615_FIRMWARE_V1             1
+#define MT7615_FIRMWARE_V2             2
+
 #define MT7615_EEPROM_SIZE             1024
 #define MT7615_TOKEN_SIZE              4096
 
@@ -178,6 +181,8 @@ struct mt7615_dev {
 
        spinlock_t token_lock;
        struct idr token;
+
+       u8 fw_ver;
 };
 
 enum {