From: Ivo van Doorn <ivdoorn@gmail.com>
To: netdev@vger.kernel.org
Cc: "John W. Linville" <linville@tuxdriver.com>
Subject: [PATCH 5/6] rt2x00 - scan handlers
Date: Tue, 8 Aug 2006 15:46:57 +0200 [thread overview]
Message-ID: <200608081546.57183.IvDoorn@gmail.com> (raw)
Move scan structure initialization and handling into
some generic handlers in rt2x00.h.
This also fixed some obscure coding when waiting for the
empty txrings before starting a scan.
Signed-off-by Ivo van Doorn <IvDoorn@gmail.com>
---
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-08-08 14:55:51.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-08-08 15:09:24.000000000 +0200
@@ -1381,10 +1381,8 @@
/*
* Cancel scanning.
*/
- if (rt2x00dev->scan) {
- rt2x00dev->scan->status = SCANNING_CANCELLED;
- complete_all(&rt2x00dev->scan->completion);
- }
+ if (rt2x00dev->scan)
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_CANCELLED);
/*
* Flush out all pending work.
@@ -1802,10 +1800,8 @@
if (rt2x00dev->scan &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_TX]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_ATIM]) &&
- rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO])) {
- rt2x00dev->scan->status = SCANNING_READY;
- complete(&rt2x00dev->scan->completion);
- }
+ rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO]))
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_READY);
/*
* If the data ring was full before the txdone handler
@@ -2153,14 +2149,7 @@
* we need to wait untill all TX rings are empty to
* guarentee that all frames are send on the correct channel.
*/
- if (rt2x00dev->scan->status != SCANNING_READY)
- wait_for_completion(&rt2x00dev->scan->completion);
-
- /*
- * Check if this scan has been cancelled while
- * work was still scheduled.
- */
- if (rt2x00dev->scan->status == SCANNING_CANCELLED)
+ if (rt2x00_wait_scan(rt2x00dev->scan))
goto exit;
/*
@@ -2232,13 +2221,7 @@
/*
* Initialize Scanning structure.
*/
- init_completion(&rt2x00dev->scan->completion);
-
- memcpy(&rt2x00dev->scan->conf, conf, sizeof(*conf));
-
- rt2x00dev->scan->state = state;
-
- rt2x00dev->scan->status = 0;
+ rt2x00_start_scan(rt2x00dev->scan, conf, state);
/*
* Queue work.
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-08-08 14:56:52.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-08-08 15:10:31.000000000 +0200
@@ -1501,10 +1501,8 @@
/*
* Cancel scanning.
*/
- if (rt2x00dev->scan) {
- rt2x00dev->scan->status = SCANNING_CANCELLED;
- complete_all(&rt2x00dev->scan->completion);
- }
+ if (rt2x00dev->scan)
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_CANCELLED);
/*
* Flush out all pending work.
@@ -1949,10 +1947,8 @@
if (rt2x00dev->scan &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_TX]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_ATIM]) &&
- rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO])) {
- rt2x00dev->scan->status = SCANNING_READY;
- complete(&rt2x00dev->scan->completion);
- }
+ rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO]))
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_READY);
/*
* If the data ring was full before the txdone handler
@@ -2301,14 +2297,7 @@
* we need to wait untill all TX rings are empty to
* guarentee that all frames are send on the correct channel.
*/
- if (rt2x00dev->scan->status != SCANNING_READY)
- wait_for_completion(&rt2x00dev->scan->completion);
-
- /*
- * Check if this scan has been cancelled while
- * work was still scheduled.
- */
- if (rt2x00dev->scan->status == SCANNING_CANCELLED)
+ if (rt2x00_wait_scan(rt2x00dev->scan))
goto exit;
/*
@@ -2376,13 +2365,7 @@
/*
* Initialize Scanning structure.
*/
- init_completion(&rt2x00dev->scan->completion);
-
- memcpy(&rt2x00dev->scan->conf, conf, sizeof(*conf));
-
- rt2x00dev->scan->state = state;
-
- rt2x00dev->scan->status = 0;
+ rt2x00_start_scan(rt2x00dev->scan, conf, state);
/*
* Queue work.
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-08-08 14:57:42.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-08-08 15:12:02.000000000 +0200
@@ -1264,10 +1264,8 @@
/*
* Cancel scanning.
*/
- if (rt2x00dev->scan) {
- rt2x00dev->scan->status = SCANNING_CANCELLED;
- complete_all(&rt2x00dev->scan->completion);
- }
+ if (rt2x00dev->scan)
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_CANCELLED);
/*
* Flush out all pending work.
@@ -1713,10 +1711,8 @@
if (rt2x00dev->scan &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_TX]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_ATIM]) &&
- rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO])) {
- rt2x00dev->scan->status = SCANNING_READY;
- complete(&rt2x00dev->scan->completion);
- }
+ rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO]))
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_READY);
/*
* If the data ring was full before the txdone handler
@@ -2026,14 +2022,7 @@
* we need to wait untill all TX rings are empty to
* guarentee that all frames are send on the correct channel.
*/
- if (rt2x00dev->scan->status != SCANNING_READY)
- wait_for_completion(&rt2x00dev->scan->completion);
-
- /*
- * Check if this scan has been cancelled while
- * work was still scheduled.
- */
- if (rt2x00dev->scan->status == SCANNING_CANCELLED)
+ if (rt2x00_wait_scan(rt2x00dev->scan))
goto exit;
/*
@@ -2101,13 +2090,7 @@
/*
* Initialize Scanning structure.
*/
- init_completion(&rt2x00dev->scan->completion);
-
- memcpy(&rt2x00dev->scan->conf, conf, sizeof(*conf));
-
- rt2x00dev->scan->state = state;
-
- rt2x00dev->scan->status = 0;
+ rt2x00_start_scan(rt2x00dev->scan, conf, state);
/*
* Queue work.
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2x00.h wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2x00.h
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-08-08 14:45:29.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-08-08 15:12:43.000000000 +0200
@@ -734,7 +734,8 @@
* Flag to see if this scan has been cancelled.
*/
short status;
-#define SCANNING_READY 0x0001
+#define SCANNING_READY 0x0000
+#define SCANNING_WAITING 0x0001
#define SCANNING_CANCELLED 0x0002
/*
@@ -743,6 +744,48 @@
struct work_struct work;
};
+static inline void rt2x00_start_scan(struct scanning *scan,
+ struct ieee80211_scan_conf *conf, int state)
+{
+ init_completion(&scan->completion);
+
+ memcpy(&scan->conf, conf, sizeof(*conf));
+
+ scan->state = state;
+
+ /*
+ * Set initial status to SCANNING_WAITING to prevent scanning
+ * to begin while there are still TX packets queued.
+ */
+ scan->status = SCANNING_WAITING;
+}
+
+static inline void rt2x00_signal_scan(struct scanning *scan, short status)
+{
+ scan->status = status;
+
+ complete_all(&scan->completion);
+}
+
+static inline int rt2x00_wait_scan(struct scanning *scan)
+{
+ /*
+ * Only wait for completion when the status
+ * indicates we should. The SCANNING_READY
+ * and SCANNING_CANCELLED are both states
+ * which indicate complete_all has already
+ * been called.
+ */
+ if (scan->status == SCANNING_WAITING)
+ wait_for_completion(&scan->completion);
+
+ /*
+ * Status field will have been updated by the handler
+ * that has called complete_all() on our complete structure.
+ */
+ return scan->status;
+}
+
/*
* rt2x00 device structure.
*/
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.c wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt61pci.c
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-08-08 14:59:09.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-08-08 15:14:45.000000000 +0200
@@ -1927,10 +1927,8 @@
/*
* Cancel scanning.
*/
- if (rt2x00dev->scan) {
- rt2x00dev->scan->status = SCANNING_CANCELLED;
- complete_all(&rt2x00dev->scan->completion);
- }
+ if (rt2x00dev->scan)
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_CANCELLED);
/*
* Flush out all pending work.
@@ -2449,10 +2447,8 @@
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_BE]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_VI]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_VO]) &&
- rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO])) {
- rt2x00dev->scan->status = SCANNING_READY;
- complete(&rt2x00dev->scan->completion);
- }
+ rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO]))
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_READY);
}
static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance,
@@ -2779,14 +2775,7 @@
* we need to wait untill all TX rings are empty to
* guarentee that all frames are send on the correct channel.
*/
- if (rt2x00dev->scan->status != SCANNING_READY)
- wait_for_completion(&rt2x00dev->scan->completion);
-
- /*
- * Check if this scan has been cancelled while
- * work was still scheduled.
- */
- if (rt2x00dev->scan->status == SCANNING_CANCELLED)
+ if (rt2x00_wait_scan(rt2x00dev->scan))
goto exit;
/*
@@ -2854,13 +2843,7 @@
/*
* Initialize Scanning structure.
*/
- init_completion(&rt2x00dev->scan->completion);
-
- memcpy(&rt2x00dev->scan->conf, conf, sizeof(*conf));
-
- rt2x00dev->scan->state = state;
-
- rt2x00dev->scan->status = 0;
+ rt2x00_start_scan(rt2x00dev->scan, conf, state);
/*
* Queue work.
diff -rU3 wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.c wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt73usb.c
--- wireless-dev-rt2x00-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-08-08 15:00:03.000000000 +0200
+++ wireless-dev-rt2x00-scan/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-08-08 15:15:57.000000000 +0200
@@ -1525,10 +1525,8 @@
/*
* Cancel scanning.
*/
- if (rt2x00dev->scan) {
- rt2x00dev->scan->status = SCANNING_CANCELLED;
- complete_all(&rt2x00dev->scan->completion);
- }
+ if (rt2x00dev->scan)
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_CANCELLED);
/*
* Flush out all pending work.
@@ -2000,10 +1998,8 @@
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_BE]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_VI]) &&
rt2x00_ring_empty(&rt2x00dev->ring[RING_AC_VO]) &&
- rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO])) {
- rt2x00dev->scan->status = SCANNING_READY;
- complete(&rt2x00dev->scan->completion);
- }
+ rt2x00_ring_empty(&rt2x00dev->ring[RING_PRIO]))
+ rt2x00_signal_scan(rt2x00dev->scan, SCANNING_READY);
/*
* If the data ring was full before the txdone handler
@@ -2309,14 +2305,7 @@
* we need to wait untill all TX rings are empty to
* guarentee that all frames are send on the correct channel.
*/
- if (rt2x00dev->scan->status != SCANNING_READY)
- wait_for_completion(&rt2x00dev->scan->completion);
-
- /*
- * Check if this scan has been cancelled while
- * work was still scheduled.
- */
- if (rt2x00dev->scan->status == SCANNING_CANCELLED)
+ if (rt2x00_wait_scan(rt2x00dev->scan))
goto exit;
/*
@@ -2384,13 +2373,7 @@
/*
* Initialize Scanning structure.
*/
- init_completion(&rt2x00dev->scan->completion);
-
- memcpy(&rt2x00dev->scan->conf, conf, sizeof(*conf));
-
- rt2x00dev->scan->state = state;
-
- rt2x00dev->scan->status = 0;
+ rt2x00_start_scan(rt2x00dev->scan, conf, state);
/*
* Queue work.
reply other threads:[~2006-08-08 13:47 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=200608081546.57183.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=linville@tuxdriver.com \
--cc=netdev@vger.kernel.org \
/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 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).