f0d9e712e4
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 42952
82 lines
2.6 KiB
Diff
82 lines
2.6 KiB
Diff
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) {
|