Skip to content

Commit

Permalink
mac80211: unset SDATA_STATE_OFFCHANNEL when cancelling a scan
Browse files Browse the repository at this point in the history
For client STA interfaces, ieee80211_do_stop unsets the relevant
interface's SDATA_STATE_RUNNING state bit prior to cancelling an
interrupted scan.  When ieee80211_offchannel_return is invoked as
part of cancelling the scan, it doesn't bother unsetting the
SDATA_STATE_OFFCHANNEL bit because it sees that the interface is
down.  Normally this doesn't matter because when the client STA
interface is brought back up, it will probably issue a scan.  But
in some cases (e.g., the user changes the interface type while it
is down), the SDATA_STATE_OFFCHANNEL bit will remain set.  This
prevents the interface queues from being started.  So we
cancel the scan before unsetting the SDATA_STATE_RUNNING bit.

Signed-off-by: Brian Cavagnolo <brian@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Brian Cavagnolo authored and John W. Linville committed Nov 8, 2010
1 parent fbb078f commit 352ffad
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions net/mac80211/iface.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
u32 hw_reconf_flags = 0;
int i;

if (local->scan_sdata == sdata)
ieee80211_scan_cancel(local);

clear_bit(SDATA_STATE_RUNNING, &sdata->state);

/*
Expand Down Expand Up @@ -523,9 +526,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
synchronize_rcu();
skb_queue_purge(&sdata->skb_queue);

if (local->scan_sdata == sdata)
ieee80211_scan_cancel(local);

/*
* Disable beaconing here for mesh only, AP and IBSS
* are already taken care of.
Expand Down

0 comments on commit 352ffad

Please sign in to comment.