rpms/kernel/devel kernel.spec, 1.719, 1.720 linux-2.6-wireless.patch, 1.42, 1.43

John W. Linville (linville) fedora-extras-commits at redhat.com
Fri Jun 27 20:00:28 UTC 2008


Author: linville

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv8587

Modified Files:
	kernel.spec linux-2.6-wireless.patch 
Log Message:
Upstream wireless fixes from 2008-06-27


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.719
retrieving revision 1.720
diff -u -r1.719 -r1.720
--- kernel.spec	27 Jun 2008 18:12:26 -0000	1.719
+++ kernel.spec	27 Jun 2008 19:59:42 -0000	1.720
@@ -1788,6 +1788,10 @@
 
 %changelog
 * Fri Jun 27 2008 John W. Linville <linville at redhat.com>
+- Upstream wireless fixes from 2008-06-27
+  (http://marc.info/?l=linux-wireless&m=121459423021061&w=2)
+
+* Fri Jun 27 2008 John W. Linville <linville at redhat.com>
 - Upstream wireless updates from 2008-06-27
   (http://marc.info/?l=linux-wireless&m=121458164930953&w=2)
 

linux-2.6-wireless.patch:

Index: linux-2.6-wireless.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-wireless.patch,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- linux-2.6-wireless.patch	25 Jun 2008 20:02:57 -0000	1.42
+++ linux-2.6-wireless.patch	27 Jun 2008 19:59:42 -0000	1.43
@@ -1,3 +1,53 @@
+commit 00eb7fe77eb455f807c396f9917f0f623d4c84bb
+Author: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
+Date:   Thu Jun 26 12:13:46 2008 +0300
+
+    mac80211: fix an oops in several failure paths in key allocation
+    
+    This patch fixes an oops in several failure paths in key allocation. This
+    Oops occurs when freeing a key that has not been linked yet, so the
+    key->sdata is not set.
+    
+    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
+    Signed-off-by: Tomas Winkler <tomas.winkler at intel.com>
+    Acked-by: Johannes Berg <johannes at sipsolutions.net>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit 5f4a6fae46a214c4dce3bd63a6219a5f1c818c78
+Author: Harvey Harrison <harvey.harrison at gmail.com>
+Date:   Wed Jun 25 14:20:37 2008 -0700
+
+    prism: islpci_eth.c endianness fix
+    
+    clock is already cpu-endian (see le32_to_cpu slightly before), so
+    le64_to_cpu doesn't make much sense.
+    
+    Signed-off-by: Harvey Harrison <harvey.harrison at gmail.com>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit 980dfcb93232907034a2c92d62d3a7d6ac7bef44
+Author: Ivo van Doorn <ivdoorn at gmail.com>
+Date:   Wed Jun 25 21:27:00 2008 +0200
+
+    rt2x00: Fix lock dependency errror
+    
+    This fixes a circular locking dependency in the workqueue handling.
+    The interface work task uses the mac80211 function
+    ieee80211_iterate_active_interfaces() which grabs the RTNL lock.
+    
+    However when the interface is brough down, this happens under the RTNL
+    lock as well, this causes problems because mac80211 will flush the workqueue
+    during the ifdown event. This causes mac80211 to wait until the driver has
+    completed all work which can't finish because it is waiting on the RTNL lock.
+    
+    This is fixed by moving rt2x00 workqueue tasks on a different workqueue,
+    this workqueue can be flushed when the ieee80211_hw structure is removed
+    by the driver (when the driver is unloaded) which does not happen under the
+    RTNL lock.
+    
+    Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
 commit 66b5004d85164a6439d3ba1e7757734472ee2cac
 Author: Ron Rindjunsky <ron.rindjunsky at intel.com>
 Date:   Wed Jun 25 16:46:31 2008 +0800
@@ -103,8 +153,8 @@
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
 diff -up linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c.orig linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c
---- linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c.orig	2008-06-25 15:43:36.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/b43/leds.c	2008-06-27 15:44:28.000000000 -0400
 @@ -72,6 +72,9 @@ static void b43_led_brightness_set(struc
  	struct b43_wldev *dev = led->dev;
  	bool radio_enabled;
@@ -116,8 +166,8 @@
  	 * but we want to avoid the locking overhead and we don't care
  	 * whether the LED has the wrong state for a second. */
 diff -up linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c.orig linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c
---- linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c.orig	2008-06-25 15:46:40.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/b43legacy/dma.c	2008-06-27 15:44:28.000000000 -0400
 @@ -876,6 +876,7 @@ struct b43legacy_dmaring *b43legacy_setu
  	if (!ring)
  		goto out;
@@ -135,8 +185,8 @@
  	ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index);
  	ring->index = controller_index;
 diff -up linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c.orig linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c
---- linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c.orig	2008-06-25 15:46:40.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/b43legacy/main.c	2008-06-27 15:44:28.000000000 -0400
 @@ -2378,8 +2378,10 @@ static int b43legacy_op_tx(struct ieee80
  	} else
  		err = b43legacy_dma_tx(dev, skb, ctl);
@@ -151,8 +201,8 @@
  }
  
 diff -up linux-2.6.25.noarch/drivers/net/wireless/b43/main.c.orig linux-2.6.25.noarch/drivers/net/wireless/b43/main.c
---- linux-2.6.25.noarch/drivers/net/wireless/b43/main.c.orig	2008-06-25 15:46:40.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/b43/main.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/b43/main.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/b43/main.c	2008-06-27 15:44:28.000000000 -0400
 @@ -2883,12 +2883,11 @@ static int b43_op_tx(struct ieee80211_hw
  
  	if (unlikely(skb->len < 2 + 2 + 6)) {
@@ -183,8 +233,8 @@
  }
  
 diff -up linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c.orig linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c
---- linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c.orig	2008-06-25 15:46:40.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c	2008-06-27 15:44:28.000000000 -0400
 @@ -2227,7 +2227,10 @@ static int iwl3945_scan_initiate(struct 
  	}
  
@@ -264,8 +314,8 @@
  		IWL_DEBUG_MAC80211("leave - invalid channel\n");
  		spin_unlock_irqrestore(&priv->lock, flags);
 diff -up linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c.orig linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c
---- linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c.orig	2008-06-25 15:46:40.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/iwlwifi/iwl4965-base.c	2008-06-27 15:44:28.000000000 -0400
 @@ -1774,7 +1774,10 @@ static int iwl4965_scan_initiate(struct 
  	}
  
@@ -364,9 +414,21 @@
  		IWL_WARNING("Invalid scan band count\n");
  		goto done;
  	}
+diff -up linux-2.6.25.noarch/drivers/net/wireless/prism54/islpci_eth.c.orig linux-2.6.25.noarch/drivers/net/wireless/prism54/islpci_eth.c
+--- linux-2.6.25.noarch/drivers/net/wireless/prism54/islpci_eth.c.orig	2008-04-16 22:49:44.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/prism54/islpci_eth.c	2008-06-27 15:45:09.000000000 -0400
+@@ -290,7 +290,7 @@ islpci_monitor_rx(islpci_private *priv, 
+ 
+ 		avs->version = cpu_to_be32(P80211CAPTURE_VERSION);
+ 		avs->length = cpu_to_be32(sizeof (struct avs_80211_1_header));
+-		avs->mactime = cpu_to_be64(le64_to_cpu(clock));
++		avs->mactime = cpu_to_be64(clock);
+ 		avs->hosttime = cpu_to_be64(jiffies);
+ 		avs->phytype = cpu_to_be32(6);	/*OFDM: 6 for (g), 8 for (a) */
+ 		avs->channel = cpu_to_be32(channel_of_freq(freq));
 diff -up linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c.orig linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c
---- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c.orig	2008-06-25 15:46:41.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2500usb.c	2008-06-27 15:44:28.000000000 -0400
 @@ -138,11 +138,8 @@ static void rt2500usb_bbp_write(struct r
  	 * Wait until the BBP becomes ready.
  	 */
@@ -436,9 +498,138 @@
  }
  
  static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev,
+diff -up linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c.orig linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c
+--- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c.orig	2008-06-27 15:43:40.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c	2008-06-27 15:45:09.000000000 -0400
+@@ -75,7 +75,7 @@ static void rt2x00lib_start_link_tuner(s
+ 
+ 	rt2x00lib_reset_link_tuner(rt2x00dev);
+ 
+-	queue_delayed_work(rt2x00dev->hw->workqueue,
++	queue_delayed_work(rt2x00dev->workqueue,
+ 			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+ }
+ 
+@@ -137,14 +137,6 @@ void rt2x00lib_disable_radio(struct rt2x
+ 		return;
+ 
+ 	/*
+-	 * Stop all scheduled work.
+-	 */
+-	if (work_pending(&rt2x00dev->intf_work))
+-		cancel_work_sync(&rt2x00dev->intf_work);
+-	if (work_pending(&rt2x00dev->filter_work))
+-		cancel_work_sync(&rt2x00dev->filter_work);
+-
+-	/*
+ 	 * Stop the TX queues.
+ 	 */
+ 	ieee80211_stop_queues(rt2x00dev->hw);
+@@ -398,8 +390,8 @@ static void rt2x00lib_link_tuner(struct 
+ 	 * Increase tuner counter, and reschedule the next link tuner run.
+ 	 */
+ 	rt2x00dev->link.count++;
+-	queue_delayed_work(rt2x00dev->hw->workqueue, &rt2x00dev->link.work,
+-			   LINK_TUNE_INTERVAL);
++	queue_delayed_work(rt2x00dev->workqueue,
++			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+ }
+ 
+ static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
+@@ -433,6 +425,15 @@ static void rt2x00lib_intf_scheduled_ite
+ 
+ 	spin_unlock(&intf->lock);
+ 
++	/*
++	 * It is possible the radio was disabled while the work had been
++	 * scheduled. If that happens we should return here immediately,
++	 * note that in the spinlock protected area above the delayed_flags
++	 * have been cleared correctly.
++	 */
++	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++		return;
++
+ 	if (delayed_flags & DELAYED_UPDATE_BEACON) {
+ 		skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control);
+ 		if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw,
+@@ -441,7 +442,7 @@ static void rt2x00lib_intf_scheduled_ite
+ 	}
+ 
+ 	if (delayed_flags & DELAYED_CONFIG_ERP)
+-		rt2x00lib_config_erp(rt2x00dev, intf, &intf->conf);
++		rt2x00lib_config_erp(rt2x00dev, intf, &conf);
+ 
+ 	if (delayed_flags & DELAYED_LED_ASSOC)
+ 		rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated);
+@@ -487,7 +488,7 @@ void rt2x00lib_beacondone(struct rt2x00_
+ 						   rt2x00lib_beacondone_iter,
+ 						   rt2x00dev);
+ 
+-	queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work);
++	queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work);
+ }
+ EXPORT_SYMBOL_GPL(rt2x00lib_beacondone);
+ 
+@@ -1130,6 +1131,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+ 	/*
+ 	 * Initialize configuration work.
+ 	 */
++	rt2x00dev->workqueue = create_singlethread_workqueue("rt2x00lib");
++	if (!rt2x00dev->workqueue)
++		goto exit;
++
+ 	INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
+ 	INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);
+ 	INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner);
+@@ -1190,6 +1195,13 @@ void rt2x00lib_remove_dev(struct rt2x00_
+ 	rt2x00leds_unregister(rt2x00dev);
+ 
+ 	/*
++	 * Stop all queued work. Note that most tasks will already be halted
++	 * during rt2x00lib_disable_radio() and rt2x00lib_uninitialize().
++	 */
++	flush_workqueue(rt2x00dev->workqueue);
++	destroy_workqueue(rt2x00dev->workqueue);
++
++	/*
+ 	 * Free ieee80211_hw memory.
+ 	 */
+ 	rt2x00lib_remove_hw(rt2x00dev);
+diff -up linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00.h.orig linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00.h
+--- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00.h.orig	2008-06-27 15:43:40.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00.h	2008-06-27 15:45:09.000000000 -0400
+@@ -821,6 +821,7 @@ struct rt2x00_dev {
+ 	/*
+ 	 * Scheduled work.
+ 	 */
++	struct workqueue_struct *workqueue;
+ 	struct work_struct intf_work;
+ 	struct work_struct filter_work;
+ 
+diff -up linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00mac.c.orig linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00mac.c
+--- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00mac.c.orig	2008-06-27 15:43:40.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt2x00mac.c	2008-06-27 15:45:09.000000000 -0400
+@@ -428,7 +428,7 @@ void rt2x00mac_configure_filter(struct i
+ 	if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags))
+ 		rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
+ 	else
+-		queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work);
++		queue_work(rt2x00dev->workqueue, &rt2x00dev->filter_work);
+ }
+ EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
+ 
+@@ -509,7 +509,7 @@ void rt2x00mac_bss_info_changed(struct i
+ 	memcpy(&intf->conf, bss_conf, sizeof(*bss_conf));
+ 	if (delayed) {
+ 		intf->delayed_flags |= delayed;
+-		queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work);
++		queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work);
+ 	}
+ 	spin_unlock(&intf->lock);
+ }
 diff -up linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c.orig linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c
---- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c.orig	2008-06-25 15:46:41.000000000 -0400
-+++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/drivers/net/wireless/rt2x00/rt73usb.c	2008-06-27 15:44:28.000000000 -0400
 @@ -134,11 +134,8 @@ static void rt73usb_bbp_write(struct rt2
  	 * Wait until the BBP becomes ready.
  	 */
@@ -506,9 +697,28 @@
  }
  
  static void rt73usb_rf_write(struct rt2x00_dev *rt2x00dev,
+diff -up linux-2.6.25.noarch/net/mac80211/key.c.orig linux-2.6.25.noarch/net/mac80211/key.c
+--- linux-2.6.25.noarch/net/mac80211/key.c.orig	2008-06-27 15:43:41.000000000 -0400
++++ linux-2.6.25.noarch/net/mac80211/key.c	2008-06-27 15:45:09.000000000 -0400
+@@ -380,6 +380,15 @@ void ieee80211_key_free(struct ieee80211
+ 	if (!key)
+ 		return;
+ 
++	if (!key->sdata) {
++		/* The key has not been linked yet, simply free it
++		 * and don't Oops */
++		if (key->conf.alg == ALG_CCMP)
++			ieee80211_aes_key_free(key->u.ccmp.tfm);
++		kfree(key);
++		return;
++	}
++
+ 	spin_lock_irqsave(&key->sdata->local->key_lock, flags);
+ 	__ieee80211_key_free(key);
+ 	spin_unlock_irqrestore(&key->sdata->local->key_lock, flags);
 diff -up linux-2.6.25.noarch/net/wireless/reg.c.orig linux-2.6.25.noarch/net/wireless/reg.c
---- linux-2.6.25.noarch/net/wireless/reg.c.orig	2008-06-25 15:46:41.000000000 -0400
-+++ linux-2.6.25.noarch/net/wireless/reg.c	2008-06-25 15:47:15.000000000 -0400
+--- linux-2.6.25.noarch/net/wireless/reg.c.orig	2008-06-27 15:43:49.000000000 -0400
++++ linux-2.6.25.noarch/net/wireless/reg.c	2008-06-27 15:44:28.000000000 -0400
 @@ -80,6 +80,23 @@ static const struct ieee80211_channel_ra
  				     IEEE80211_CHAN_RADAR),
  };




More information about the fedora-extras-commits mailing list