* [PATCH 07/11] rt2x00: Don't toggle promisc mode in link_tuner
@ 2007-07-25 20:50 Ivo van Doorn
0 siblings, 0 replies; only message in thread
From: Ivo van Doorn @ 2007-07-25 20:50 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, rt2400-devel
>From 582bd822ff4318911ba7f676efbed573d11de339 Mon Sep 17 00:00:00 2001
From: Ivo van Doorn <IvDoorn@gmail.com>
Date: Tue, 24 Jul 2007 18:02:37 +0200
Subject: [PATCH 07/11] rt2x00: Don't toggle promisc mode in link_tuner
We shouldn't abuse the link tuner by using it
for scheduled promisc mode toggling.
Add a new flag that indicates if promisc mode
can be toggled atomically or not. For
non-atomic promisc mode toggling we leave
the task to the config() handler the next
time that is run.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
drivers/net/wireless/mac80211/rt2x00/rt2500usb.c | 2 ++
drivers/net/wireless/mac80211/rt2x00/rt2x00.h | 3 ++-
drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c | 6 ------
drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c | 21 +++++++++++++--------
drivers/net/wireless/mac80211/rt2x00/rt61pci.c | 2 +-
drivers/net/wireless/mac80211/rt2x00/rt73usb.c | 4 +++-
6 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt2500usb.c b/drivers/net/wireless/mac80211/rt2x00/rt2500usb.c
index 77e7a95..aa63b6d 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt2500usb.c
@@ -1418,8 +1418,10 @@ static int rt2500usb_init_hw(struct rt2x00_dev *rt2x00dev)
rt2500usb_init_hw_mode(rt2x00dev);
/*
+ * USB devices require scheduled promisc mode toggling
* This device supports ATIM
*/
+ __set_bit(REQUIRE_SCHEDULE_PROMISC, &rt2x00dev->flags);
__set_bit(DEVICE_SUPPORT_ATIM, &rt2x00dev->flags);
/*
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt2x00.h b/drivers/net/wireless/mac80211/rt2x00/rt2x00.h
index 4a71a96..bae34f9 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/mac80211/rt2x00/rt2x00.h
@@ -777,7 +777,8 @@ struct rt2x00_dev {
#define DEVICE_ENABLED_RADIO_HW 2
#define DEVICE_INITIALIZED 3
#define DEVICE_INITIALIZED_HW 4
-#define FIRMWARE_REQUIRED 5
+#define REQUIRE_FIRMWARE 5
+#define REQUIRE_SCHEDULE_PROMISC 6
/* Gap: New flags can be inserted here */
#define INTERFACE_ENABLED 8
#define INTERFACE_ENABLED_MONITOR 9
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c b/drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c
index b8c3f7b..43a606f 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c
@@ -106,12 +106,6 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
container_of(work, struct rt2x00_dev, link.work.work);
/*
- * Update promisc mode (this function will first check
- * if updating is really required).
- */
- rt2x00lib_config_promisc(rt2x00dev, rt2x00dev->interface.promisc);
-
- /*
* Cancel all link tuning if the eeprom has indicated
* it is not required.
*/
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c b/drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c
index 447c55c..247ea4e 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c
@@ -166,7 +166,7 @@ int rt2x00lib_add_interface(struct ieee80211_hw *hw,
/*
* We must load firmware before we can safely continue.
*/
- if (test_bit(FIRMWARE_REQUIRED, &rt2x00dev->flags)) {
+ if (test_bit(REQUIRE_FIRMWARE, &rt2x00dev->flags)) {
status = rt2x00lib_load_firmware(rt2x00dev);
if (status)
return status;
@@ -266,6 +266,14 @@ int rt2x00lib_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
conf->beacon_int);
/*
+ * If promisc mode cannot be configured in irq context,
+ * then it is now the time to configure it.
+ */
+ if (test_bit(REQUIRE_SCHEDULE_PROMISC, &rt2x00dev->flags))
+ rt2x00lib_config_promisc(rt2x00dev,
+ rt2x00dev->interface.promisc);
+
+ /*
* Reenable RX only if the radio should be on.
*/
if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
@@ -345,13 +353,10 @@ void rt2x00lib_set_multicast_list(struct ieee80211_hw *hw,
rt2x00dev->interface.promisc = !!(flags & IFF_PROMISC);
- /*
- * Schedule the link tuner if this does not run
- * automatically. The link tuner will be automatically
- * switched off when it is not required.
- */
- if (!work_pending(&rt2x00dev->link.work.work))
- queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->link.work.work);
+ if (!test_bit(REQUIRE_SCHEDULE_PROMISC, &rt2x00dev->flags) ||
+ !in_atomic())
+ rt2x00lib_config_promisc(rt2x00dev,
+ rt2x00dev->interface.promisc);
}
EXPORT_SYMBOL_GPL(rt2x00lib_set_multicast_list);
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt61pci.c b/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
index 3999cc8..937b120 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
@@ -2222,7 +2222,7 @@ static int rt61pci_init_hw(struct rt2x00_dev *rt2x00dev)
/*
* This device requires firmware
*/
- __set_bit(FIRMWARE_REQUIRED, &rt2x00dev->flags);
+ __set_bit(REQUIRE_FIRMWARE, &rt2x00dev->flags);
/*
* Set the rssi offset.
diff --git a/drivers/net/wireless/mac80211/rt2x00/rt73usb.c b/drivers/net/wireless/mac80211/rt2x00/rt73usb.c
index 0188c72..3505bf6 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt73usb.c
@@ -1667,9 +1667,11 @@ static int rt73usb_init_hw(struct rt2x00_dev *rt2x00dev)
rt73usb_init_hw_mode(rt2x00dev);
/*
+ * USB devices require scheduled promisc mode toggling
* This device requires firmware
*/
- __set_bit(FIRMWARE_REQUIRED, &rt2x00dev->flags);
+ __set_bit(REQUIRE_FIRMWARE, &rt2x00dev->flags);
+ __set_bit(REQUIRE_SCHEDULE_PROMISC, &rt2x00dev->flags);
/*
* Set the rssi offset.
--
1.5.2.2
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2007-07-25 20:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-25 20:50 [PATCH 07/11] rt2x00: Don't toggle promisc mode in link_tuner Ivo van Doorn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).