aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorZhu Yi <yi.zhu@intel.com>2007-11-21 21:53:21 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:55:27 -0500
commitece8edddf067d21c4e5abfe3f1205da1588edbb2 (patch)
tree25450d1aedc630a538ca2f13aa0fa47100256182 /net/mac80211/rx.c
parentf68635e627f9b21db05102e2d8fcd2894493d6bc (diff)
mac80211: hardware scan rework
The scan code in mac80211 makes the software scan assumption in various places. For example, we stop the Tx queue during a software scan so that all the Tx packets will be queued by the stack. We also drop frames not related to scan in the software scan process. But these are not true for hardware scan. Some wireless hardwares (for example iwl3945/4965) has the ability to perform the whole scan process by hardware and/or firmware. The hardware scan is relative powerful in that it tries to maintain normal network traffic while doing a scan in the background. Some drivers (i.e iwlwifi) do provide a way to tune the hardware scan parameters (for example if the STA is associated, what's the max time could the STA leave from the associated channel, how long the scans get suspended after returning to the service channel, etc). But basically this is transparent to the stack. mac80211 should not stop Tx queues or drop Rx packets during a hardware scan. This patch resolves the above problem by spliting the current scan indicator local->sta_scanning into local->sta_sw_scanning and local->sta_hw_scanning. It then changes the scan related code to be aware of hardware scan or software scan in various places. With this patch, iwlwifi performs much better in the scan-while-associated condition and disable_hw_scan=1 should never be required. Cc: Mohamed Abbas <mohamed.abbas@intel.com> Cc: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index a7263fc476bd..a26aa7f50495 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -338,8 +338,14 @@ ieee80211_rx_h_passive_scan(struct ieee80211_txrx_data *rx)
338 struct ieee80211_local *local = rx->local; 338 struct ieee80211_local *local = rx->local;
339 struct sk_buff *skb = rx->skb; 339 struct sk_buff *skb = rx->skb;
340 340
341 if (unlikely(local->sta_scanning != 0)) { 341 if (unlikely(local->sta_hw_scanning))
342 ieee80211_sta_rx_scan(rx->dev, skb, rx->u.rx.status); 342 return ieee80211_sta_rx_scan(rx->dev, skb, rx->u.rx.status);
343
344 if (unlikely(local->sta_sw_scanning)) {
345 /* drop all the other packets during a software scan anyway */
346 if (ieee80211_sta_rx_scan(rx->dev, skb, rx->u.rx.status)
347 != TXRX_QUEUED)
348 dev_kfree_skb(skb);
343 return TXRX_QUEUED; 349 return TXRX_QUEUED;
344 } 350 }
345 351
@@ -1499,7 +1505,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1499 goto end; 1505 goto end;
1500 } 1506 }
1501 1507
1502 if (unlikely(local->sta_scanning)) 1508 if (unlikely(local->sta_sw_scanning || local->sta_hw_scanning))
1503 rx.flags |= IEEE80211_TXRXD_RXIN_SCAN; 1509 rx.flags |= IEEE80211_TXRXD_RXIN_SCAN;
1504 1510
1505 if (__ieee80211_invoke_rx_handlers(local, local->rx_pre_handlers, &rx, 1511 if (__ieee80211_invoke_rx_handlers(local, local->rx_pre_handlers, &rx,