aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/scan.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-12-23 13:15:32 +0100
committerJohn W. Linville <linville@tuxdriver.com>2009-12-28 16:54:51 -0500
commita80f7c0b088187c8471b441d461e937991870661 (patch)
treef673c08009a03f2e988a638510b112a5584bea11 /net/mac80211/scan.c
parent9607e6b66a0d25ca63b70d54a4283fa13d8f7c9d (diff)
downloadkernel_samsung_aries-a80f7c0b088187c8471b441d461e937991870661.zip
kernel_samsung_aries-a80f7c0b088187c8471b441d461e937991870661.tar.gz
kernel_samsung_aries-a80f7c0b088187c8471b441d461e937991870661.tar.bz2
mac80211: introduce flush operation
We've long lacked a good confirmation that frames have really gone out, e.g. before going off-channel for a scan. Add a flush() operation that drivers can implement to provide that confirmation, and use it in a few places: * before scanning sends the nullfunc frames * after scanning sends the nullfunc frames, if any * when going idle, to send any pending frames Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r--net/mac80211/scan.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index ae18300..d98c45e 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -418,9 +418,10 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
local->next_scan_state = SCAN_DECISION;
local->scan_channel_idx = 0;
+ drv_flush(local, false);
+
ieee80211_configure_filter(local);
- /* TODO: start scan as soon as all nullfunc frames are ACKed */
ieee80211_queue_delayed_work(&local->hw,
&local->scan_work,
IEEE80211_CHANNEL_TIME);
@@ -584,8 +585,16 @@ static void ieee80211_scan_state_leave_oper_channel(struct ieee80211_local *loca
__set_bit(SCAN_OFF_CHANNEL, &local->scanning);
+ /*
+ * What if the nullfunc frames didn't arrive?
+ */
+ drv_flush(local, false);
+ if (local->ops->flush)
+ *next_delay = 0;
+ else
+ *next_delay = HZ / 10;
+
/* advance to the next channel to be scanned */
- *next_delay = HZ / 10;
local->next_scan_state = SCAN_SET_CHANNEL;
}