summaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch')
-rw-r--r--package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch82
1 files changed, 82 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch b/package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch
new file mode 100644
index 0000000000..e743eb8d83
--- /dev/null
+++ b/package/kernel/mac80211/patches/304-ath9k-Enable-multi-channel-properly.patch
@@ -0,0 +1,82 @@
+From: Sujith Manoharan <c_manoha@qca.qualcomm.com>
+Date: Fri, 17 Oct 2014 07:40:09 +0530
+Subject: [PATCH] ath9k: Enable multi-channel properly
+
+In MCC mode, currently the decision to enable
+the multi-channel state machine is done
+based on the association status if one of
+the interfaces assigned to a context is in
+station mode.
+
+This allows the driver to switch to the other
+context before the current station is able to
+complete the 4-way handshake in case it is
+required and this causes problems.
+
+Instead, enable multi-channel mode when the
+station moves to the authorized state. This
+disallows an early switch to the other channel.
+
+Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -362,7 +362,7 @@ enum ath_chanctx_event {
+ ATH_CHANCTX_EVENT_BEACON_SENT,
+ ATH_CHANCTX_EVENT_TSF_TIMER,
+ ATH_CHANCTX_EVENT_BEACON_RECEIVED,
+- ATH_CHANCTX_EVENT_ASSOC,
++ ATH_CHANCTX_EVENT_AUTHORIZED,
+ ATH_CHANCTX_EVENT_SWITCH,
+ ATH_CHANCTX_EVENT_ASSIGN,
+ ATH_CHANCTX_EVENT_UNASSIGN,
+--- a/drivers/net/wireless/ath/ath9k/channel.c
++++ b/drivers/net/wireless/ath/ath9k/channel.c
+@@ -171,7 +171,7 @@ static const char *chanctx_event_string(
+ case_rtn_string(ATH_CHANCTX_EVENT_BEACON_SENT);
+ case_rtn_string(ATH_CHANCTX_EVENT_TSF_TIMER);
+ case_rtn_string(ATH_CHANCTX_EVENT_BEACON_RECEIVED);
+- case_rtn_string(ATH_CHANCTX_EVENT_ASSOC);
++ case_rtn_string(ATH_CHANCTX_EVENT_AUTHORIZED);
+ case_rtn_string(ATH_CHANCTX_EVENT_SWITCH);
+ case_rtn_string(ATH_CHANCTX_EVENT_ASSIGN);
+ case_rtn_string(ATH_CHANCTX_EVENT_UNASSIGN);
+@@ -510,7 +510,7 @@ void ath_chanctx_event(struct ath_softc
+
+ ath_chanctx_setup_timer(sc, tsf_time);
+ break;
+- case ATH_CHANCTX_EVENT_ASSOC:
++ case ATH_CHANCTX_EVENT_AUTHORIZED:
+ if (sc->sched.state != ATH_CHANCTX_STATE_FORCE_ACTIVE ||
+ avp->chanctx != sc->cur_chan)
+ break;
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -1569,6 +1569,13 @@ static int ath9k_sta_state(struct ieee80
+ "Remove station: %pM\n", sta->addr);
+ }
+
++ if (ath9k_is_chanctx_enabled()) {
++ if (old_state == IEEE80211_STA_ASSOC &&
++ new_state == IEEE80211_STA_AUTHORIZED)
++ ath_chanctx_event(sc, vif,
++ ATH_CHANCTX_EVENT_AUTHORIZED);
++ }
++
+ return ret;
+ }
+
+@@ -1761,12 +1768,6 @@ static void ath9k_bss_info_changed(struc
+ avp->assoc = bss_conf->assoc;
+
+ ath9k_calculate_summary_state(sc, avp->chanctx);
+-
+- if (ath9k_is_chanctx_enabled()) {
+- if (bss_conf->assoc)
+- ath_chanctx_event(sc, vif,
+- ATH_CHANCTX_EVENT_ASSOC);
+- }
+ }
+
+ if (changed & BSS_CHANGED_IBSS) {