All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org, rt2400-devel@lists.sourceforge.net
Subject: [PATCH 07/11] rt2x00: Don't toggle promisc mode in link_tuner
Date: Wed, 25 Jul 2007 22:50:18 +0200	[thread overview]
Message-ID: <200707252250.18745.IvDoorn@gmail.com> (raw)

>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


                 reply	other threads:[~2007-07-25 20:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200707252250.18745.IvDoorn@gmail.com \
    --to=ivdoorn@gmail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=rt2400-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.