rtlwifi: Add code to read new versions of firmware
authorLarry Finger <Larry.Finger@lwfinger.net>
Thu, 23 Feb 2017 17:19:56 +0000 (11:19 -0600)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 20 Mar 2017 17:10:15 +0000 (19:10 +0200)
Changes in the drivers for RTL8723BE and RTL8821AE require corresponding
changes in the firmware. This new firmware has been accepted into the
Linux firmware repo. To handle the case where the kernel has been
updated before the firmware, the new versions have been given new names.
The code will attempt to read the new name, and fall back to the old one
if the new one is not available.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c

index 92dbfa8f297f318a766506e50be2d102c312f470..8c0ac96b543005efe8348b7f09dfa4f2be725e90 100644 (file)
@@ -91,7 +91,7 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
-       char *fw_name = "rtlwifi/rtl8723befw.bin";
+       char *fw_name = "rtlwifi/rtl8723befw_36.bin";
 
        rtl8723be_bt_reg_init(hw);
        rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
@@ -187,8 +187,16 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
                                      rtlpriv->io.dev, GFP_KERNEL, hw,
                                      rtl_fw_cb);
        if (err) {
-               pr_err("Failed to request firmware!\n");
-               return 1;
+               /* Failed to get firmware. Check if old version available */
+               fw_name = "rtlwifi/rtl8723befw.bin";
+               pr_info("Using firmware %s\n", fw_name);
+               err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
+                                             rtlpriv->io.dev, GFP_KERNEL, hw,
+                                             rtl_fw_cb);
+               if (err) {
+                       pr_err("Failed to request firmware!\n");
+                       return 1;
+               }
        }
        return 0;
 }
@@ -384,6 +392,7 @@ MODULE_AUTHOR("Realtek WlanFAE      <wlanfae@realtek.com>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Realtek 8723BE 802.11n PCI wireless");
 MODULE_FIRMWARE("rtlwifi/rtl8723befw.bin");
+MODULE_FIRMWARE("rtlwifi/rtl8723befw_36.bin");
 
 module_param_named(swenc, rtl8723be_mod_params.sw_crypto, bool, 0444);
 module_param_named(debug_level, rtl8723be_mod_params.debug_level, int, 0644);
index 77cf3b2cd3f1f4c7ba93437996efe55ad3d94fb5..abaf34cb14331487d8bd3ad789ea5450148d74f4 100644 (file)
@@ -203,7 +203,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
                fw_name = "rtlwifi/rtl8812aefw.bin";
                wowlan_fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
        } else {
-               fw_name = "rtlwifi/rtl8821aefw.bin";
+               fw_name = "rtlwifi/rtl8821aefw_29.bin";
                wowlan_fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
        }
 
@@ -214,8 +214,16 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
                                      rtlpriv->io.dev, GFP_KERNEL, hw,
                                      rtl_fw_cb);
        if (err) {
-               pr_err("Failed to request normal firmware!\n");
-               return 1;
+               /* Failed to get firmware. Check if old version available */
+               fw_name = "rtlwifi/rtl8821aefw.bin";
+               pr_info("Using firmware %s\n", fw_name);
+               err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
+                                             rtlpriv->io.dev, GFP_KERNEL, hw,
+                                             rtl_fw_cb);
+               if (err) {
+                       pr_err("Failed to request normal firmware!\n");
+                       return 1;
+               }
        }
        /*load wowlan firmware*/
        pr_info("Using firmware %s\n", wowlan_fw_name);
@@ -428,6 +436,7 @@ MODULE_AUTHOR("Realtek WlanFAE      <wlanfae@realtek.com>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Realtek 8821ae 802.11ac PCI wireless");
 MODULE_FIRMWARE("rtlwifi/rtl8821aefw.bin");
+MODULE_FIRMWARE("rtlwifi/rtl8821aefw_29.bin");
 
 module_param_named(swenc, rtl8821ae_mod_params.sw_crypto, bool, 0444);
 module_param_named(debug_level, rtl8821ae_mod_params.debug_level, int, 0644);