aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/ieee80211_sta.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-03-05 04:58:40 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-03-06 16:40:54 -0500
commit69d3b6f491545d326135a1def4e290cd577c9a36 (patch)
treec28e93c1473daf8c54546eb2faf3b0ba6ca9f200 /net/mac80211/ieee80211_sta.c
parent2a8ca29a88e3858685c463ffd19e11c20d14c73a (diff)
mac80211: fix hardware scan completion
The mac80211 MLME requires restarting timers after a scan completes but this wasn't done when hardware scan offload was added, so add it now. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Tested-by: Bill Moss <bmoss@clemson.edu> Cc: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211_sta.c')
-rw-r--r--net/mac80211/ieee80211_sta.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index 75ced9a5476c..bece28b3eba5 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -3576,6 +3576,13 @@ static void ieee80211_send_nullfunc(struct ieee80211_local *local,
3576} 3576}
3577 3577
3578 3578
3579static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
3580{
3581 if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
3582 ieee80211_vif_is_mesh(&sdata->vif))
3583 ieee80211_sta_timer((unsigned long)sdata);
3584}
3585
3579void ieee80211_scan_completed(struct ieee80211_hw *hw) 3586void ieee80211_scan_completed(struct ieee80211_hw *hw)
3580{ 3587{
3581 struct ieee80211_local *local = hw_to_local(hw); 3588 struct ieee80211_local *local = hw_to_local(hw);
@@ -3589,6 +3596,12 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
3589 3596
3590 if (local->sta_hw_scanning) { 3597 if (local->sta_hw_scanning) {
3591 local->sta_hw_scanning = 0; 3598 local->sta_hw_scanning = 0;
3599 /* Restart STA timer for HW scan case */
3600 rcu_read_lock();
3601 list_for_each_entry_rcu(sdata, &local->interfaces, list)
3602 ieee80211_restart_sta_timer(sdata);
3603 rcu_read_unlock();
3604
3592 goto done; 3605 goto done;
3593 } 3606 }
3594 3607
@@ -3615,14 +3628,12 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
3615 if (sdata->dev == local->mdev) 3628 if (sdata->dev == local->mdev)
3616 continue; 3629 continue;
3617 3630
3618 if (sdata->vif.type == IEEE80211_IF_TYPE_STA) { 3631 /* Tell AP we're back */
3619 if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) 3632 if (sdata->vif.type == IEEE80211_IF_TYPE_STA &&
3620 ieee80211_send_nullfunc(local, sdata, 0); 3633 sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)
3621 ieee80211_sta_timer((unsigned long)sdata); 3634 ieee80211_send_nullfunc(local, sdata, 0);
3622 }
3623 3635
3624 if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) 3636 ieee80211_restart_sta_timer(sdata);
3625 ieee80211_sta_timer((unsigned long)sdata);
3626 3637
3627 netif_wake_queue(sdata->dev); 3638 netif_wake_queue(sdata->dev);
3628 } 3639 }