Skip to content

Commit cf4747d

Browse files
lwfingerKalle Valo
authored andcommitted
rtlwifi: Fix regression caused by commit d86e647
In commit d86e647 ("rtlwifi: rtl818x: constify local structures"), the configuration struct for most of the drivers was changed to be constant. The problem is that five of the modified drivers need to be able to update the firmware name based on the exact model of the card. As the file names were stored in one of the members of that struct, these drivers would fail with a kernel BUG splat when they tried to update the firmware name. Rather than reverting the previous commit, I used a suggestion by Johannes Berg and made the firmware file name pointers be local to the routines that update the software variables. The configuration struct of rtl8192cu, which was not touched in the previous patch, is now constantfied. Fixes: d86e647 ("rtlwifi: rtl818x: constify local structures") Suggested-by: Johannes Berg <[email protected]> Signed-off-by: Larry Finger <[email protected]> Cc: Stable <[email protected]> # 4.8 Cc: Julia Lawall <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent 29d5e6f commit cf4747d

File tree

11 files changed

+45
-51
lines changed

11 files changed

+45
-51
lines changed

drivers/net/wireless/realtek/rtlwifi/core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context,
111111
if (!err)
112112
goto found_alt;
113113
}
114-
pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
114+
pr_err("Selected firmware is not available\n");
115115
rtlpriv->max_fw_size = 0;
116116
return;
117117
}

drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
8686
struct rtl_priv *rtlpriv = rtl_priv(hw);
8787
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
8888
u8 tid;
89+
char *fw_name;
8990

9091
rtl8188ee_bt_reg_init(hw);
9192
rtlpriv->dm.dm_initialgain_enable = 1;
@@ -169,10 +170,10 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
169170
return 1;
170171
}
171172

172-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8188efw.bin";
173+
fw_name = "rtlwifi/rtl8188efw.bin";
173174
rtlpriv->max_fw_size = 0x8000;
174-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
175-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
175+
pr_info("Using firmware %s\n", fw_name);
176+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
176177
rtlpriv->io.dev, GFP_KERNEL, hw,
177178
rtl_fw_cb);
178179
if (err) {
@@ -284,7 +285,6 @@ static const struct rtl_hal_cfg rtl88ee_hal_cfg = {
284285
.bar_id = 2,
285286
.write_readback = true,
286287
.name = "rtl88e_pci",
287-
.fw_name = "rtlwifi/rtl8188efw.bin",
288288
.ops = &rtl8188ee_hal_ops,
289289
.mod_params = &rtl88ee_mod_params,
290290

drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
9696
struct rtl_priv *rtlpriv = rtl_priv(hw);
9797
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9898
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
99+
char *fw_name = "rtlwifi/rtl8192cfwU.bin";
99100

100101
rtl8192ce_bt_reg_init(hw);
101102

@@ -167,15 +168,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
167168
}
168169

169170
/* request fw */
170-
if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
171-
!IS_92C_SERIAL(rtlhal->version))
172-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
173-
else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version))
174-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
171+
if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version))
172+
fw_name = "rtlwifi/rtl8192cfwU_B.bin";
175173

176174
rtlpriv->max_fw_size = 0x4000;
177-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
178-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
175+
pr_info("Using firmware %s\n", fw_name);
176+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
179177
rtlpriv->io.dev, GFP_KERNEL, hw,
180178
rtl_fw_cb);
181179
if (err) {
@@ -262,7 +260,6 @@ static const struct rtl_hal_cfg rtl92ce_hal_cfg = {
262260
.bar_id = 2,
263261
.write_readback = true,
264262
.name = "rtl92c_pci",
265-
.fw_name = "rtlwifi/rtl8192cfw.bin",
266263
.ops = &rtl8192ce_hal_ops,
267264
.mod_params = &rtl92ce_mod_params,
268265

drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
5959
{
6060
struct rtl_priv *rtlpriv = rtl_priv(hw);
6161
int err;
62+
char *fw_name;
6263

6364
rtlpriv->dm.dm_initialgain_enable = true;
6465
rtlpriv->dm.dm_flag = 0;
@@ -77,18 +78,18 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
7778
}
7879
if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) &&
7980
!IS_92C_SERIAL(rtlpriv->rtlhal.version)) {
80-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin";
81+
fw_name = "rtlwifi/rtl8192cufw_A.bin";
8182
} else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) {
82-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin";
83+
fw_name = "rtlwifi/rtl8192cufw_B.bin";
8384
} else {
84-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
85+
fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
8586
}
8687
/* provide name of alternative file */
8788
rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin";
88-
pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
89+
pr_info("Loading firmware %s\n", fw_name);
8990
rtlpriv->max_fw_size = 0x4000;
9091
err = request_firmware_nowait(THIS_MODULE, 1,
91-
rtlpriv->cfg->fw_name, rtlpriv->io.dev,
92+
fw_name, rtlpriv->io.dev,
9293
GFP_KERNEL, hw, rtl_fw_cb);
9394
return err;
9495
}
@@ -187,7 +188,6 @@ static struct rtl_hal_usbint_cfg rtl92cu_interface_cfg = {
187188

188189
static struct rtl_hal_cfg rtl92cu_hal_cfg = {
189190
.name = "rtl92c_usb",
190-
.fw_name = "rtlwifi/rtl8192cufw.bin",
191191
.ops = &rtl8192cu_hal_ops,
192192
.mod_params = &rtl92cu_mod_params,
193193
.usb_interface_cfg = &rtl92cu_interface_cfg,

drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
9292
u8 tid;
9393
struct rtl_priv *rtlpriv = rtl_priv(hw);
9494
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
95+
char *fw_name = "rtlwifi/rtl8192defw.bin";
9596

9697
rtlpriv->dm.dm_initialgain_enable = true;
9798
rtlpriv->dm.dm_flag = 0;
@@ -181,10 +182,10 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
181182

182183
rtlpriv->max_fw_size = 0x8000;
183184
pr_info("Driver for Realtek RTL8192DE WLAN interface\n");
184-
pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
185+
pr_info("Loading firmware file %s\n", fw_name);
185186

186187
/* request fw */
187-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
188+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
188189
rtlpriv->io.dev, GFP_KERNEL, hw,
189190
rtl_fw_cb);
190191
if (err) {
@@ -266,7 +267,6 @@ static const struct rtl_hal_cfg rtl92de_hal_cfg = {
266267
.bar_id = 2,
267268
.write_readback = true,
268269
.name = "rtl8192de",
269-
.fw_name = "rtlwifi/rtl8192defw.bin",
270270
.ops = &rtl8192de_hal_ops,
271271
.mod_params = &rtl92de_mod_params,
272272

drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ int rtl92ee_init_sw_vars(struct ieee80211_hw *hw)
9191
struct rtl_priv *rtlpriv = rtl_priv(hw);
9292
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9393
int err = 0;
94+
char *fw_name;
9495

9596
rtl92ee_bt_reg_init(hw);
9697
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
@@ -170,11 +171,11 @@ int rtl92ee_init_sw_vars(struct ieee80211_hw *hw)
170171
}
171172

172173
/* request fw */
173-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192eefw.bin";
174+
fw_name = "rtlwifi/rtl8192eefw.bin";
174175

175176
rtlpriv->max_fw_size = 0x8000;
176-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
177-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
177+
pr_info("Using firmware %s\n", fw_name);
178+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
178179
rtlpriv->io.dev, GFP_KERNEL, hw,
179180
rtl_fw_cb);
180181
if (err) {
@@ -266,7 +267,6 @@ static const struct rtl_hal_cfg rtl92ee_hal_cfg = {
266267
.bar_id = 2,
267268
.write_readback = true,
268269
.name = "rtl92ee_pci",
269-
.fw_name = "rtlwifi/rtl8192eefw.bin",
270270
.ops = &rtl8192ee_hal_ops,
271271
.mod_params = &rtl92ee_mod_params,
272272

drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,13 @@ static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
8989
struct ieee80211_hw *hw = context;
9090
struct rtl_priv *rtlpriv = rtl_priv(hw);
9191
struct rt_firmware *pfirmware = NULL;
92+
char *fw_name = "rtlwifi/rtl8192sefw.bin";
9293

9394
RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
9495
"Firmware callback routine entered!\n");
9596
complete(&rtlpriv->firmware_loading_complete);
9697
if (!firmware) {
97-
pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
98+
pr_err("Firmware %s not available\n", fw_name);
9899
rtlpriv->max_fw_size = 0;
99100
return;
100101
}
@@ -117,6 +118,7 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
117118
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
118119
int err = 0;
119120
u16 earlyrxthreshold = 7;
121+
char *fw_name = "rtlwifi/rtl8192sefw.bin";
120122

121123
rtlpriv->dm.dm_initialgain_enable = true;
122124
rtlpriv->dm.dm_flag = 0;
@@ -214,9 +216,9 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
214216
rtlpriv->max_fw_size = RTL8190_MAX_FIRMWARE_CODE_SIZE*2 +
215217
sizeof(struct fw_hdr);
216218
pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n"
217-
"Loading firmware %s\n", rtlpriv->cfg->fw_name);
219+
"Loading firmware %s\n", fw_name);
218220
/* request fw */
219-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
221+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
220222
rtlpriv->io.dev, GFP_KERNEL, hw,
221223
rtl92se_fw_cb);
222224
if (err) {
@@ -310,7 +312,6 @@ static const struct rtl_hal_cfg rtl92se_hal_cfg = {
310312
.bar_id = 1,
311313
.write_readback = false,
312314
.name = "rtl92s_pci",
313-
.fw_name = "rtlwifi/rtl8192sefw.bin",
314315
.ops = &rtl8192se_hal_ops,
315316
.mod_params = &rtl92se_mod_params,
316317

drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ int rtl8723e_init_sw_vars(struct ieee80211_hw *hw)
9494
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9595
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
9696
int err = 0;
97+
char *fw_name = "rtlwifi/rtl8723fw.bin";
9798

9899
rtl8723e_bt_reg_init(hw);
99100

@@ -176,14 +177,12 @@ int rtl8723e_init_sw_vars(struct ieee80211_hw *hw)
176177
return 1;
177178
}
178179

179-
if (IS_VENDOR_8723_A_CUT(rtlhal->version))
180-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8723fw.bin";
181-
else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
182-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8723fw_B.bin";
180+
if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
181+
fw_name = "rtlwifi/rtl8723fw_B.bin";
183182

184183
rtlpriv->max_fw_size = 0x6000;
185-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
186-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
184+
pr_info("Using firmware %s\n", fw_name);
185+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
187186
rtlpriv->io.dev, GFP_KERNEL, hw,
188187
rtl_fw_cb);
189188
if (err) {
@@ -280,7 +279,6 @@ static const struct rtl_hal_cfg rtl8723e_hal_cfg = {
280279
.bar_id = 2,
281280
.write_readback = true,
282281
.name = "rtl8723e_pci",
283-
.fw_name = "rtlwifi/rtl8723efw.bin",
284282
.ops = &rtl8723e_hal_ops,
285283
.mod_params = &rtl8723e_mod_params,
286284
.maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,

drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
9191
struct rtl_priv *rtlpriv = rtl_priv(hw);
9292
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9393
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
94+
char *fw_name = "rtlwifi/rtl8723befw.bin";
9495

9596
rtl8723be_bt_reg_init(hw);
9697
rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
@@ -184,8 +185,8 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
184185
}
185186

186187
rtlpriv->max_fw_size = 0x8000;
187-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
188-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
188+
pr_info("Using firmware %s\n", fw_name);
189+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
189190
rtlpriv->io.dev, GFP_KERNEL, hw,
190191
rtl_fw_cb);
191192
if (err) {
@@ -280,7 +281,6 @@ static const struct rtl_hal_cfg rtl8723be_hal_cfg = {
280281
.bar_id = 2,
281282
.write_readback = true,
282283
.name = "rtl8723be_pci",
283-
.fw_name = "rtlwifi/rtl8723befw.bin",
284284
.ops = &rtl8723be_hal_ops,
285285
.mod_params = &rtl8723be_mod_params,
286286
.maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
9393
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9494
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
9595
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
96+
char *fw_name, *wowlan_fw_name;
9697

9798
rtl8821ae_bt_reg_init(hw);
9899
rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
@@ -203,17 +204,17 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
203204
}
204205

205206
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
206-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8812aefw.bin";
207-
rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
207+
fw_name = "rtlwifi/rtl8812aefw.bin";
208+
wowlan_fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
208209
} else {
209-
rtlpriv->cfg->fw_name = "rtlwifi/rtl8821aefw.bin";
210-
rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
210+
fw_name = "rtlwifi/rtl8821aefw.bin";
211+
wowlan_fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
211212
}
212213

213214
rtlpriv->max_fw_size = 0x8000;
214215
/*load normal firmware*/
215-
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
216-
err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
216+
pr_info("Using firmware %s\n", fw_name);
217+
err = request_firmware_nowait(THIS_MODULE, 1, fw_name,
217218
rtlpriv->io.dev, GFP_KERNEL, hw,
218219
rtl_fw_cb);
219220
if (err) {
@@ -222,9 +223,9 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
222223
return 1;
223224
}
224225
/*load wowlan firmware*/
225-
pr_info("Using firmware %s\n", rtlpriv->cfg->wowlan_fw_name);
226+
pr_info("Using firmware %s\n", wowlan_fw_name);
226227
err = request_firmware_nowait(THIS_MODULE, 1,
227-
rtlpriv->cfg->wowlan_fw_name,
228+
wowlan_fw_name,
228229
rtlpriv->io.dev, GFP_KERNEL, hw,
229230
rtl_wowlan_fw_cb);
230231
if (err) {
@@ -320,7 +321,6 @@ static const struct rtl_hal_cfg rtl8821ae_hal_cfg = {
320321
.bar_id = 2,
321322
.write_readback = true,
322323
.name = "rtl8821ae_pci",
323-
.fw_name = "rtlwifi/rtl8821aefw.bin",
324324
.ops = &rtl8821ae_hal_ops,
325325
.mod_params = &rtl8821ae_mod_params,
326326
.maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,

drivers/net/wireless/realtek/rtlwifi/wifi.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,9 +2278,7 @@ struct rtl_hal_cfg {
22782278
u8 bar_id;
22792279
bool write_readback;
22802280
char *name;
2281-
char *fw_name;
22822281
char *alt_fw_name;
2283-
char *wowlan_fw_name;
22842282
struct rtl_hal_ops *ops;
22852283
struct rtl_mod_params *mod_params;
22862284
struct rtl_hal_usbint_cfg *usb_interface_cfg;

0 commit comments

Comments
 (0)