On 2017-09-07 16:32 +0200, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > The patch below does not apply to the 4.12-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. Same as for 4.13-stable, I suggest to include commit f2764f61fa10 ("rtlwifi: Fix memory leak when firmware request fails") before 1d9b168d8ea9. Cheers, Sven > ------------------ original commit in Linus's tree ------------------ > >>From 1d9b168d8ea9a0f51947d0e2f84856e77d2fe7ff Mon Sep 17 00:00:00 2001 > From: Sven Joachim <svenjoac@xxxxxx> > Date: Mon, 31 Jul 2017 18:10:45 +0200 > Subject: [PATCH] rtlwifi: Fix fallback firmware loading > > Commit f70e4df2b384 ("rtlwifi: Add code to read new versions of > firmware") added code to load an old firmware file if the new one is > not available. Unfortunately that code is never reached because > request_firmware_nowait() does not wait for the firmware to show up > and returns 0 even if the file is not there. > > Use the existing fallback mechanism introduced by commit 62009b7f1279 > ("rtlwifi: rtl8192cu: Add new firmware") instead. > > Fixes: f70e4df2b384 ("rtlwifi: Add code to read new versions of firmware") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Sven Joachim <svenjoac@xxxxxx> > Signed-off-by: Kalle Valo <kvalo@xxxxxxxxxxxxxx> > > diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c > index 56c05c4e1499..f47d839f388d 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c > +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c > @@ -187,18 +187,10 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw) > rtlpriv->io.dev, GFP_KERNEL, hw, > rtl_fw_cb); > if (err) { > - /* 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"); > - vfree(rtlpriv->rtlhal.pfirmware); > - rtlpriv->rtlhal.pfirmware = NULL; > - return 1; > - } > + pr_err("Failed to request firmware!\n"); > + vfree(rtlpriv->rtlhal.pfirmware); > + rtlpriv->rtlhal.pfirmware = NULL; > + return 1; > } > return 0; > } > @@ -289,6 +281,7 @@ static const struct rtl_hal_cfg rtl8723be_hal_cfg = { > .bar_id = 2, > .write_readback = true, > .name = "rtl8723be_pci", > + .alt_fw_name = "rtlwifi/rtl8723befw.bin", > .ops = &rtl8723be_hal_ops, > .mod_params = &rtl8723be_mod_params, > .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL, > diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c > index ec2d577ba85b..5925edf7877f 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c > +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c > @@ -216,18 +216,10 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw) > rtlpriv->io.dev, GFP_KERNEL, hw, > rtl_fw_cb); > if (err) { > - /* 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"); > - vfree(rtlpriv->rtlhal.wowlan_firmware); > - vfree(rtlpriv->rtlhal.pfirmware); > - return 1; > - } > + pr_err("Failed to request normal firmware!\n"); > + vfree(rtlpriv->rtlhal.wowlan_firmware); > + vfree(rtlpriv->rtlhal.pfirmware); > + return 1; > } > /*load wowlan firmware*/ > pr_info("Using firmware %s\n", wowlan_fw_name); > @@ -331,6 +323,7 @@ static const struct rtl_hal_cfg rtl8821ae_hal_cfg = { > .bar_id = 2, > .write_readback = true, > .name = "rtl8821ae_pci", > + .alt_fw_name = "rtlwifi/rtl8821aefw.bin", > .ops = &rtl8821ae_hal_ops, > .mod_params = &rtl8821ae_mod_params, > .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,