mt76x0: align mt76x0u and mt76x0e fw version
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Fri, 19 Oct 2018 09:40:48 +0000 (11:40 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 30 Nov 2018 11:21:40 +0000 (12:21 +0100)
Unify firmware version used on mt76x0e and mt76x0u drivers.
Fallback to mt7610u fw if mt7610e one is not available

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
drivers/net/wireless/mediatek/mt76/mt76x0/usb_mcu.c

index 0f11815..282814c 100644 (file)
@@ -31,6 +31,8 @@
 #define MT7610E_FIRMWARE               "mediatek/mt7610e.bin"
 #define MT7650E_FIRMWARE               "mediatek/mt7650e.bin"
 
+#define MT7610U_FIRMWARE               "mediatek/mt7610u.bin"
+
 #define MT_USB_AGGR_SIZE_LIMIT         21 /* * 1024B */
 #define MT_USB_AGGR_TIMEOUT            0x80 /* * 33ns */
 
index cdbb8a6..245eb4a 100644 (file)
@@ -337,6 +337,8 @@ err:
 }
 
 MODULE_DEVICE_TABLE(usb, mt76x0_device_table);
+MODULE_FIRMWARE(MT7610E_FIRMWARE);
+MODULE_FIRMWARE(MT7610U_FIRMWARE);
 MODULE_LICENSE("GPL");
 
 static struct usb_driver mt76x0_driver = {
index a9f14d5..9d75850 100644 (file)
@@ -22,7 +22,6 @@
 
 #define MCU_FW_URB_MAX_PAYLOAD         0x38f8
 #define MCU_FW_URB_SIZE                        (MCU_FW_URB_MAX_PAYLOAD + 12)
-#define MT7610U_FIRMWARE               "mediatek/mt7610u.bin"
 
 static int
 mt76x0u_upload_firmware(struct mt76x02_dev *dev,
@@ -75,6 +74,24 @@ out:
        return err;
 }
 
+static int mt76x0_get_firmware(struct mt76x02_dev *dev,
+                              const struct firmware **fw)
+{
+       int err;
+
+       /* try to load mt7610e fw if available
+        * otherwise fall back to mt7610u one
+        */
+       err = firmware_request_nowarn(fw, MT7610E_FIRMWARE, dev->mt76.dev);
+       if (err) {
+               dev_info(dev->mt76.dev, "%s not found, switching to %s",
+                        MT7610E_FIRMWARE, MT7610U_FIRMWARE);
+               return request_firmware(fw, MT7610U_FIRMWARE,
+                                       dev->mt76.dev);
+       }
+       return 0;
+}
+
 static int mt76x0u_load_firmware(struct mt76x02_dev *dev)
 {
        const struct firmware *fw;
@@ -88,7 +105,7 @@ static int mt76x0u_load_firmware(struct mt76x02_dev *dev)
        if (mt76x0_firmware_running(dev))
                return 0;
 
-       ret = request_firmware(&fw, MT7610U_FIRMWARE, dev->mt76.dev);
+       ret = mt76x0_get_firmware(dev, &fw);
        if (ret)
                return ret;
 
@@ -171,5 +188,3 @@ int mt76x0u_mcu_init(struct mt76x02_dev *dev)
 
        return 0;
 }
-
-MODULE_FIRMWARE(MT7610U_FIRMWARE);