diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2013-11-18 12:11:26 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-12-05 14:55:04 -0500 |
commit | 62009b7f12793c932aaba0df946b04cb4a77d022 (patch) | |
tree | 2dd5912260b890c414bc8b40568d2891c61e739d /drivers/net/wireless/rtlwifi | |
parent | 8fd77aec1a9d6f4328fc0244f21932114e066df3 (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.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/wifi.h | 1 |
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 | } |
62 | found_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>"); | |||
50 | MODULE_LICENSE("GPL"); | 50 | MODULE_LICENSE("GPL"); |
51 | MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); | 51 | MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); |
52 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); | 52 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); |
53 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); | ||
54 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); | ||
55 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin"); | ||
53 | 56 | ||
54 | static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) | 57 | static 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; |