diff options
author | Arik Nemtsov <arik@wizery.com> | 2014-07-10 20:01:36 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-07-15 16:00:00 -0400 |
commit | e65628691f04f1a9ce57d8036c9b119c43031187 (patch) | |
tree | 9a59d65558e3e85c08500bafd9bb31564ee888a2 /drivers/net/wireless/ti | |
parent | d8c5a48d2751086de9ed0ae9ff97ab094e2d534d (diff) |
wlcore: don't switch channels on disconnected STA vifs
Sending the FW a channel switch command on a disconnected
vif may result in a beacon loss event. Avoid this corner case.
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ti')
-rw-r--r-- | drivers/net/wireless/ti/wlcore/main.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c index d92f578dd95c..ec211413ffe6 100644 --- a/drivers/net/wireless/ti/wlcore/main.c +++ b/drivers/net/wireless/ti/wlcore/main.c | |||
@@ -5192,6 +5192,10 @@ static void wl12xx_op_channel_switch(struct ieee80211_hw *hw, | |||
5192 | if (unlikely(wl->state == WLCORE_STATE_OFF)) { | 5192 | if (unlikely(wl->state == WLCORE_STATE_OFF)) { |
5193 | wl12xx_for_each_wlvif_sta(wl, wlvif) { | 5193 | wl12xx_for_each_wlvif_sta(wl, wlvif) { |
5194 | struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); | 5194 | struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); |
5195 | |||
5196 | if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) | ||
5197 | continue; | ||
5198 | |||
5195 | ieee80211_chswitch_done(vif, false); | 5199 | ieee80211_chswitch_done(vif, false); |
5196 | } | 5200 | } |
5197 | goto out; | 5201 | goto out; |
@@ -5207,6 +5211,9 @@ static void wl12xx_op_channel_switch(struct ieee80211_hw *hw, | |||
5207 | wl12xx_for_each_wlvif_sta(wl, wlvif) { | 5211 | wl12xx_for_each_wlvif_sta(wl, wlvif) { |
5208 | unsigned long delay_usec; | 5212 | unsigned long delay_usec; |
5209 | 5213 | ||
5214 | if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) | ||
5215 | continue; | ||
5216 | |||
5210 | ret = wl->ops->channel_switch(wl, wlvif, ch_switch); | 5217 | ret = wl->ops->channel_switch(wl, wlvif, ch_switch); |
5211 | if (ret) | 5218 | if (ret) |
5212 | goto out_sleep; | 5219 | goto out_sleep; |