Skip to content

Commit fe89707

Browse files
troy-tanKalle Valo
authored andcommitted
rtlwifi: rtl8821ae: Simplify loading of WOWLAN firmware
The existing method for loading both normal and WOWLAN firmware for the device duplicates a lot of code. This solution is much cleaner. Signed-off-by: Troy Tan <[email protected]> Signed-off-by: Larry Finger <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent a844bae commit fe89707

File tree

4 files changed

+48
-54
lines changed

4 files changed

+48
-54
lines changed

drivers/net/wireless/rtlwifi/core.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
9595
}
9696
EXPORT_SYMBOL(rtl_bb_delay);
9797

98-
void rtl_fw_cb(const struct firmware *firmware, void *context)
98+
static void rtl_fw_do_work(const struct firmware *firmware, void *context,
99+
bool is_wow)
99100
{
100101
struct ieee80211_hw *hw = context;
101102
struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -125,12 +126,31 @@ void rtl_fw_cb(const struct firmware *firmware, void *context)
125126
release_firmware(firmware);
126127
return;
127128
}
128-
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
129+
if (!is_wow) {
130+
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data,
131+
firmware->size);
132+
rtlpriv->rtlhal.fwsize = firmware->size;
133+
} else {
134+
memcpy(rtlpriv->rtlhal.wowlan_firmware, firmware->data,
135+
firmware->size);
136+
rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
137+
}
129138
rtlpriv->rtlhal.fwsize = firmware->size;
130139
release_firmware(firmware);
131140
}
141+
142+
void rtl_fw_cb(const struct firmware *firmware, void *context)
143+
{
144+
rtl_fw_do_work(firmware, context, false);
145+
}
132146
EXPORT_SYMBOL(rtl_fw_cb);
133147

148+
void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context)
149+
{
150+
rtl_fw_do_work(firmware, context, true);
151+
}
152+
EXPORT_SYMBOL(rtl_wowlan_fw_cb);
153+
134154
/*mutex for start & stop is must here. */
135155
static int rtl_op_start(struct ieee80211_hw *hw)
136156
{

drivers/net/wireless/rtlwifi/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
extern const struct ieee80211_ops rtl_ops;
3939
void rtl_fw_cb(const struct firmware *firmware, void *context);
40+
void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context);
4041
void rtl_addr_delay(u32 addr);
4142
void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
4243
u32 mask, u32 data);

drivers/net/wireless/rtlwifi/rtl8821ae/sw.c

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -85,52 +85,6 @@ static void rtl8821ae_init_aspm_vars(struct ieee80211_hw *hw)
8585
rtlpci->const_support_pciaspm = 1;
8686
}
8787

88-
static void load_wowlan_fw(struct rtl_priv *rtlpriv)
89-
{
90-
/* callback routine to load wowlan firmware after main fw has
91-
* been loaded
92-
*/
93-
const struct firmware *wowlan_firmware;
94-
char *fw_name = NULL;
95-
int err;
96-
97-
/* for wowlan firmware buf */
98-
rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
99-
if (!rtlpriv->rtlhal.wowlan_firmware) {
100-
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
101-
"Can't alloc buffer for wowlan fw.\n");
102-
return;
103-
}
104-
105-
if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8821AE)
106-
fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
107-
else
108-
fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
109-
err = request_firmware(&wowlan_firmware, fw_name, rtlpriv->io.dev);
110-
if (err) {
111-
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
112-
"Failed to request wowlan firmware!\n");
113-
goto error;
114-
}
115-
116-
if (wowlan_firmware->size > 0x8000) {
117-
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
118-
"Wowlan Firmware is too big!\n");
119-
goto error;
120-
}
121-
122-
memcpy(rtlpriv->rtlhal.wowlan_firmware, wowlan_firmware->data,
123-
wowlan_firmware->size);
124-
rtlpriv->rtlhal.wowlan_fwsize = wowlan_firmware->size;
125-
release_firmware(wowlan_firmware);
126-
127-
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "WOWLAN FirmwareDownload OK\n");
128-
return;
129-
error:
130-
release_firmware(wowlan_firmware);
131-
vfree(rtlpriv->rtlhal.wowlan_firmware);
132-
}
133-
13488
/*InitializeVariables8812E*/
13589
int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
13690
{
@@ -231,28 +185,48 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
231185
else if (rtlpriv->psc.reg_fwctrl_lps == 3)
232186
rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
233187

234-
rtlpriv->rtl_fw_second_cb = load_wowlan_fw;
235188
/* for firmware buf */
236189
rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
237190
if (!rtlpriv->rtlhal.pfirmware) {
238191
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
239192
"Can't alloc buffer for fw.\n");
240193
return 1;
241194
}
195+
rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
196+
if (!rtlpriv->rtlhal.wowlan_firmware) {
197+
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
198+
"Can't alloc buffer for wowlan fw.\n");
199+
return 1;
200+
}
242201

243-
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
202+
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
244203
rtlpriv->cfg->fw_name = "rtlwifi/rtl8812aefw.bin";
245-
else
204+
rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
205+
} else {
246206
rtlpriv->cfg->fw_name = "rtlwifi/rtl8821aefw.bin";
207+
rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
208+
}
247209

248210
rtlpriv->max_fw_size = 0x8000;
211+
/*load normal firmware*/
249212
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
250213
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
251214
rtlpriv->io.dev, GFP_KERNEL, hw,
252215
rtl_fw_cb);
253216
if (err) {
254217
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
255-
"Failed to request firmware!\n");
218+
"Failed to request normal firmware!\n");
219+
return 1;
220+
}
221+
/*load wowlan firmware*/
222+
pr_info("Using firmware %s\n", rtlpriv->cfg->wowlan_fw_name);
223+
err = request_firmware_nowait(THIS_MODULE, 1,
224+
rtlpriv->cfg->wowlan_fw_name,
225+
rtlpriv->io.dev, GFP_KERNEL, hw,
226+
rtl_wowlan_fw_cb);
227+
if (err) {
228+
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
229+
"Failed to request wowlan firmware!\n");
256230
return 1;
257231
}
258232
return 0;

drivers/net/wireless/rtlwifi/wifi.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2242,6 +2242,7 @@ struct rtl_hal_cfg {
22422242
char *name;
22432243
char *fw_name;
22442244
char *alt_fw_name;
2245+
char *wowlan_fw_name;
22452246
struct rtl_hal_ops *ops;
22462247
struct rtl_mod_params *mod_params;
22472248
struct rtl_hal_usbint_cfg *usb_interface_cfg;
@@ -2518,8 +2519,6 @@ struct proxim {
25182519

25192520
struct rtl_priv {
25202521
struct ieee80211_hw *hw;
2521-
/* Used to load a second firmware */
2522-
void (*rtl_fw_second_cb)(struct rtl_priv *rtlpriv);
25232522
struct completion firmware_loading_complete;
25242523
struct list_head list;
25252524
struct rtl_priv *buddy_priv;

0 commit comments

Comments
 (0)