diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-08-27 07:45:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-08-27 13:53:31 -0400 |
commit | 5b714c6a3753dad0798a70a049e15c7f6bc9446b (patch) | |
tree | 39345981014b14e881cbfbef87a4a3a74469fada /net/mac80211/ieee80211_i.h | |
parent | c35d02705e9c2db90a89b29142046b4ffd5a76e5 (diff) |
mac80211: fix offchannel queue stop
Somebody noticed this problem, and I outlined
to them how to fix it, but haven't heard back
from them. So while I was adding the state
field I figured I could use it to fix it.
The problem, as I understand it, is that when
we go offchannel while the driver has a queue
stopped, the driver will likely start draining
the queue and then enable it while offchannel.
This in turn will enable the interface queue,
and that leads to transmitting data frames on
the wrong channel.
Fix this by keeping track of offchannel status
per interface, and not enabling the interface
queues on interfaces that are offchannel when
the driver enables a queue.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index d529bd5eab47..9af50fbcd48b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -477,9 +477,12 @@ enum ieee80211_sub_if_data_flags { | |||
477 | * @SDATA_STATE_RUNNING: virtual interface is up & running; this | 477 | * @SDATA_STATE_RUNNING: virtual interface is up & running; this |
478 | * mirrors netif_running() but is separate for interface type | 478 | * mirrors netif_running() but is separate for interface type |
479 | * change handling while the interface is up | 479 | * change handling while the interface is up |
480 | * @SDATA_STATE_OFFCHANNEL: This interface is currently in offchannel | ||
481 | * mode, so queues are stopped | ||
480 | */ | 482 | */ |
481 | enum ieee80211_sdata_state_bits { | 483 | enum ieee80211_sdata_state_bits { |
482 | SDATA_STATE_RUNNING, | 484 | SDATA_STATE_RUNNING, |
485 | SDATA_STATE_OFFCHANNEL, | ||
483 | }; | 486 | }; |
484 | 487 | ||
485 | struct ieee80211_sub_if_data { | 488 | struct ieee80211_sub_if_data { |