[kernel/f16] Fix rtlwifi async firmware load race condition (rhbz 822120)

Josh Boyer jwboyer at fedoraproject.org
Thu May 17 17:42:02 UTC 2012


commit 5a132922397c267a1e9692020620c86f6f325561
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Thu May 17 10:30:44 2012 -0400

    Fix rtlwifi async firmware load race condition (rhbz 822120)

 kernel.spec                                        |   11 +++-
 ...-for-race-condition-when-firmware-is-cach.patch |   86 ++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 3290889..0a9d5ad 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -54,7 +54,7 @@ Summary: The Linux kernel
 # For non-released -rc kernels, this will be appended after the rcX and
 # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
 #
-%global baserelease 3
+%global baserelease 4
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
@@ -801,6 +801,9 @@ Patch22018: atl1c_net_next_update-3.3.patch
 #rhbz 795176
 Patch22019: rtl818x-fix-sleeping-function-called-from-invalid-context.patch
 
+#rhbz 822120
+Patch22020: rtlwifi-fix-for-race-condition-when-firmware-is-cach.patch
+
 # END OF PATCH DEFINITIONS
 
 %endif
@@ -1491,6 +1494,9 @@ ApplyPatch atl1c_net_next_update-3.3.patch
 #rhbz 795176
 ApplyPatch rtl818x-fix-sleeping-function-called-from-invalid-context.patch
 
+#rhbz 822120
+ApplyPatch rtlwifi-fix-for-race-condition-when-firmware-is-cach.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2229,6 +2235,9 @@ fi
 # and build.
 
 %changelog
+* Thu May 17 2012 Josh Boyer <jwboyer at redhat.com>
+- Fix rtlwifi async firmware load race condition (rhbz 822120)
+
 * Wed May 16 2012 Justin M. Forbes <jforbes at redhat.com> 3.3.6-3
 - fix rtl8187: ->brightness_set can not sleep (rhbz 795176)
 
diff --git a/rtlwifi-fix-for-race-condition-when-firmware-is-cach.patch b/rtlwifi-fix-for-race-condition-when-firmware-is-cach.patch
new file mode 100644
index 0000000..431ec00
--- /dev/null
+++ b/rtlwifi-fix-for-race-condition-when-firmware-is-cach.patch
@@ -0,0 +1,86 @@
+From 574e02abaf816b582685805f0c1150ca9f1f18ee Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Fri, 4 May 2012 08:27:43 -0500
+Subject: [PATCH] rtlwifi: fix for race condition when firmware is cached
+
+In commit b0302ab, the rtlwifi family of drivers was converted to use
+asynchronous firmware loading. Unfortumately, the implementation was
+racy, and the ieee80211 routines could be started before rtl_init_core()
+was called to setup the data.
+
+This patch fixes the bug noted in https://bugzilla.kernel.org/show_bug.cgi?id=43187.
+
+Reported-by: Joshua Roys <Joshua.Roys at gtri.gatech.edu>
+Tested-by: Neptune Ning <frostyplanet at gmail.com>
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Cc: Stable <stable at vger.kernel.org>    [3.3]
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/pci.c |   16 ++++++++--------
+ drivers/net/wireless/rtlwifi/usb.c |   10 +++++-----
+ 2 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index b588ca8..03c400e 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -1865,14 +1865,6 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
+ 	/*like read eeprom and so on */
+ 	rtlpriv->cfg->ops->read_eeprom_info(hw);
+ 
+-	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 ("Can't init_sw_vars.\n"));
+-		goto fail3;
+-	}
+-
+-	rtlpriv->cfg->ops->init_sw_leds(hw);
+-
+ 	/*aspm */
+ 	rtl_pci_init_aspm(hw);
+ 
+@@ -1892,6 +1884,14 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
+ 		goto fail3;
+ 	}
+ 
++	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
++			 ("Can't init_sw_vars.\n"));
++		goto fail3;
++	}
++
++	rtlpriv->cfg->ops->init_sw_leds(hw);
++
+ 	err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group);
+ 	if (err) {
+ 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
+index 049e207..20b53ae 100644
+--- a/drivers/net/wireless/rtlwifi/usb.c
++++ b/drivers/net/wireless/rtlwifi/usb.c
+@@ -970,12 +970,6 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
+ 	rtlpriv->cfg->ops->read_chip_version(hw);
+ 	/*like read eeprom and so on */
+ 	rtlpriv->cfg->ops->read_eeprom_info(hw);
+-	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 ("Can't init_sw_vars.\n"));
+-		goto error_out;
+-	}
+-	rtlpriv->cfg->ops->init_sw_leds(hw);
+ 	err = _rtl_usb_init(hw);
+ 	err = _rtl_usb_init_sw(hw);
+ 	/* Init mac80211 sw */
+@@ -985,6 +979,12 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
+ 			 ("Can't allocate sw for mac80211.\n"));
+ 		goto error_out;
+ 	}
++	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
++			 ("Can't init_sw_vars.\n"));
++		goto error_out;
++	}
++	rtlpriv->cfg->ops->init_sw_leds(hw);
+ 
+ 	return 0;
+ error_out:


More information about the scm-commits mailing list