]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.12-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Sep 2017 09:45:02 +0000 (11:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Sep 2017 09:45:02 +0000 (11:45 +0200)
added patches:
rtlwifi-fix-fallback-firmware-loading.patch
rtlwifi-fix-memory-leak-when-firmware-request-fails.patch

queue-4.12/rtlwifi-fix-fallback-firmware-loading.patch [new file with mode: 0644]
queue-4.12/rtlwifi-fix-memory-leak-when-firmware-request-fails.patch [new file with mode: 0644]
queue-4.12/series

diff --git a/queue-4.12/rtlwifi-fix-fallback-firmware-loading.patch b/queue-4.12/rtlwifi-fix-fallback-firmware-loading.patch
new file mode 100644 (file)
index 0000000..f257901
--- /dev/null
@@ -0,0 +1,94 @@
+From 1d9b168d8ea9a0f51947d0e2f84856e77d2fe7ff Mon Sep 17 00:00:00 2001
+From: Sven Joachim <svenjoac@gmx.de>
+Date: Mon, 31 Jul 2017 18:10:45 +0200
+Subject: rtlwifi: Fix fallback firmware loading
+
+From: Sven Joachim <svenjoac@gmx.de>
+
+commit 1d9b168d8ea9a0f51947d0e2f84856e77d2fe7ff upstream.
+
+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")
+Signed-off-by: Sven Joachim <svenjoac@gmx.de>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c |   17 +++++------------
+ drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c |   17 +++++------------
+ 2 files changed, 10 insertions(+), 24 deletions(-)
+
+--- 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 ieee80
+                                     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 rtl8723b
+       .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,
+--- 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 ieee80
+                                     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 rtl8821a
+       .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,
diff --git a/queue-4.12/rtlwifi-fix-memory-leak-when-firmware-request-fails.patch b/queue-4.12/rtlwifi-fix-memory-leak-when-firmware-request-fails.patch
new file mode 100644 (file)
index 0000000..9ea48e9
--- /dev/null
@@ -0,0 +1,148 @@
+From f2764f61fa10593204b0c5e4e9a68dba02112e50 Mon Sep 17 00:00:00 2001
+From: Souptick Joarder <jrdr.linux@gmail.com>
+Date: Wed, 5 Jul 2017 19:55:06 +0530
+Subject: rtlwifi: Fix memory leak when firmware request fails
+
+From: Souptick Joarder <jrdr.linux@gmail.com>
+
+commit f2764f61fa10593204b0c5e4e9a68dba02112e50 upstream.
+
+This patch will fix memory leak when firmware request fails
+
+Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
+Acked-by: Larry Finger <Larry.Finger@lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Cc: Sven Joachim <svenjoac@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c |    4 ++++
+ drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c |    2 ++
+ drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c |    6 ++++++
+ 9 files changed, 24 insertions(+)
+
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
+@@ -175,6 +175,8 @@ int rtl88e_init_sw_vars(struct ieee80211
+                                     rtl_fw_cb);
+       if (err) {
+               pr_info("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c
+@@ -176,6 +176,8 @@ int rtl92c_init_sw_vars(struct ieee80211
+                                     rtl_fw_cb);
+       if (err) {
+               pr_err("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c
+@@ -85,6 +85,10 @@ static int rtl92cu_init_sw_vars(struct i
+       err = request_firmware_nowait(THIS_MODULE, 1,
+                                     fw_name, rtlpriv->io.dev,
+                                     GFP_KERNEL, hw, rtl_fw_cb);
++      if (err) {
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
++      }
+       return err;
+ }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c
+@@ -183,6 +183,8 @@ static int rtl92d_init_sw_vars(struct ie
+                                     rtl_fw_cb);
+       if (err) {
+               pr_err("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+@@ -177,6 +177,8 @@ int rtl92ee_init_sw_vars(struct ieee8021
+                                     rtl_fw_cb);
+       if (err) {
+               pr_err("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c
+@@ -216,6 +216,8 @@ static int rtl92s_init_sw_vars(struct ie
+                                     rtl92se_fw_cb);
+       if (err) {
+               pr_err("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c
+@@ -184,6 +184,8 @@ int rtl8723e_init_sw_vars(struct ieee802
+                                     rtl_fw_cb);
+       if (err) {
+               pr_err("Failed to request firmware!\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+       return 0;
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
+@@ -195,6 +195,8 @@ int rtl8723be_init_sw_vars(struct ieee80
+                                             rtl_fw_cb);
+               if (err) {
+                       pr_err("Failed to request firmware!\n");
++                      vfree(rtlpriv->rtlhal.pfirmware);
++                      rtlpriv->rtlhal.pfirmware = NULL;
+                       return 1;
+               }
+       }
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
+@@ -196,6 +196,8 @@ int rtl8821ae_init_sw_vars(struct ieee80
+       rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
+       if (!rtlpriv->rtlhal.wowlan_firmware) {
+               pr_err("Can't alloc buffer for wowlan fw.\n");
++              vfree(rtlpriv->rtlhal.pfirmware);
++              rtlpriv->rtlhal.pfirmware = NULL;
+               return 1;
+       }
+@@ -222,6 +224,8 @@ int rtl8821ae_init_sw_vars(struct ieee80
+                                             rtl_fw_cb);
+               if (err) {
+                       pr_err("Failed to request normal firmware!\n");
++                      vfree(rtlpriv->rtlhal.wowlan_firmware);
++                      vfree(rtlpriv->rtlhal.pfirmware);
+                       return 1;
+               }
+       }
+@@ -233,6 +237,8 @@ int rtl8821ae_init_sw_vars(struct ieee80
+                                     rtl_wowlan_fw_cb);
+       if (err) {
+               pr_err("Failed to request wowlan firmware!\n");
++              vfree(rtlpriv->rtlhal.wowlan_firmware);
++              vfree(rtlpriv->rtlhal.pfirmware);
+               return 1;
+       }
+       return 0;
index b8ed589b9c1a8974e91a284da64540d1030f4d2c..63d693064ef2511a50bcbec8610ba90a90088f0e 100644 (file)
@@ -39,3 +39,5 @@ cs5536-add-support-for-ide-controller-variant.patch
 scsi-sg-protect-against-races-between-mmap-and-sg_set_reserved_size.patch
 scsi-sg-recheck-mmap_io-request-length-with-lock-held.patch
 of-device-prevent-buffer-overflow-in-of_device_modalias.patch
+rtlwifi-fix-memory-leak-when-firmware-request-fails.patch
+rtlwifi-fix-fallback-firmware-loading.patch