From ababd6da9870f49eb202a54db656f7f1ce73b610 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Wed, 21 Jul 2010 10:52:40 +0200 Subject: [PATCH] --- yaml --- r: 203738 b: refs/heads/master c: bc05d19f4b884b1dbbce48912710ae3f972c89d2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/mac80211/ibss.c | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 8704def830d8..0c3a5217b71f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9dca9c490146e787472bc05b264e043311a4c67b +refs/heads/master: bc05d19f4b884b1dbbce48912710ae3f972c89d2 diff --git a/trunk/net/mac80211/ibss.c b/trunk/net/mac80211/ibss.c index d4e84b22a66d..090e344d5f90 100644 --- a/trunk/net/mac80211/ibss.c +++ b/trunk/net/mac80211/ibss.c @@ -943,11 +943,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) } } - del_timer_sync(&sdata->u.ibss.timer); - clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); - cancel_work_sync(&sdata->work); - clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); - sta_info_flush(sdata->local, sdata); /* remove beacon */ @@ -964,6 +959,20 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) memset(sdata->u.ibss.bssid, 0, ETH_ALEN); sdata->u.ibss.ssid_len = 0; + /* + * ssid_len indicates active or not, so needs to be visible to + * everybody, especially ieee80211_ibss_notify_scan_completed, + * so it won't restart the timer after we remove it here. + */ + mb(); + + del_timer_sync(&sdata->u.ibss.timer); + clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); + /* + * Since the REQ_RUN bit is clear, the work won't do + * anything if it runs after this. + */ + ieee80211_recalc_idle(sdata->local); return 0;