aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2013-11-18 12:11:26 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-12-05 14:55:04 -0500
commit62009b7f12793c932aaba0df946b04cb4a77d022 (patch)
tree2dd5912260b890c414bc8b40568d2891c61e739d /drivers/net/wireless/rtlwifi
parent8fd77aec1a9d6f4328fc0244f21932114e066df3 (diff)
rtlwifi: rtl8192cu: Add new firmware
Vendor driver rtl8188C_8192C_8192D_usb_linux_v3.4.2_3727.20120404 introduced new firmware for these chips. The code try for the new file, and fall back to the original firmware if the new file is not available. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Stable <stable@vger.kernel.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r--drivers/net/wireless/rtlwifi/core.c10
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c16
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h1
3 files changed, 24 insertions, 3 deletions
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 210ce7cd94d8..8dc4d9308593 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -46,10 +46,20 @@ void rtl_fw_cb(const struct firmware *firmware, void *context)
46 "Firmware callback routine entered!\n"); 46 "Firmware callback routine entered!\n");
47 complete(&rtlpriv->firmware_loading_complete); 47 complete(&rtlpriv->firmware_loading_complete);
48 if (!firmware) { 48 if (!firmware) {
49 if (rtlpriv->cfg->alt_fw_name) {
50 err = request_firmware(&firmware,
51 rtlpriv->cfg->alt_fw_name,
52 rtlpriv->io.dev);
53 pr_info("Loading alternative firmware %s\n",
54 rtlpriv->cfg->alt_fw_name);
55 if (!err)
56 goto found_alt;
57 }
49 pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name); 58 pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
50 rtlpriv->max_fw_size = 0; 59 rtlpriv->max_fw_size = 0;
51 return; 60 return;
52 } 61 }
62found_alt:
53 if (firmware->size > rtlpriv->max_fw_size) { 63 if (firmware->size > rtlpriv->max_fw_size) {
54 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 64 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
55 "Firmware is too big!\n"); 65 "Firmware is too big!\n");
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 9936de716ad5..8501954cfb44 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -50,6 +50,9 @@ MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
50MODULE_LICENSE("GPL"); 50MODULE_LICENSE("GPL");
51MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); 51MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
52MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); 52MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
53MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin");
54MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin");
55MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
53 56
54static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) 57static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
55{ 58{
@@ -69,14 +72,21 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
69 "Can't alloc buffer for fw\n"); 72 "Can't alloc buffer for fw\n");
70 return 1; 73 return 1;
71 } 74 }
72 75 if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) &&
76 !IS_92C_SERIAL(rtlpriv->rtlhal.version)) {
77 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin";
78 } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) {
79 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin";
80 } else {
81 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
82 }
83 /* provide name of alternative file */
84 rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin";
73 pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name); 85 pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
74 rtlpriv->max_fw_size = 0x4000; 86 rtlpriv->max_fw_size = 0x4000;
75 err = request_firmware_nowait(THIS_MODULE, 1, 87 err = request_firmware_nowait(THIS_MODULE, 1,
76 rtlpriv->cfg->fw_name, rtlpriv->io.dev, 88 rtlpriv->cfg->fw_name, rtlpriv->io.dev,
77 GFP_KERNEL, hw, rtl_fw_cb); 89 GFP_KERNEL, hw, rtl_fw_cb);
78
79
80 return err; 90 return err;
81} 91}
82 92
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 0c65386fa30d..0aa89fd89f35 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -1804,6 +1804,7 @@ struct rtl_hal_cfg {
1804 bool write_readback; 1804 bool write_readback;
1805 char *name; 1805 char *name;
1806 char *fw_name; 1806 char *fw_name;
1807 char *alt_fw_name;
1807 struct rtl_hal_ops *ops; 1808 struct rtl_hal_ops *ops;
1808 struct rtl_mod_params *mod_params; 1809 struct rtl_mod_params *mod_params;
1809 struct rtl_hal_usbint_cfg *usb_interface_cfg; 1810 struct rtl_hal_usbint_cfg *usb_interface_cfg;