mirror of https://gitee.com/openkylin/linux.git
ath9k: Use ath_chanctx_check_active properly
ath_chanctx_check_active() is required only when channel contexts are used. Make sure that it is not called in normal usage. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
e90e302a15
commit
a09798f4ab
|
@ -417,8 +417,6 @@ ath_chanctx_get(struct ieee80211_chanctx_conf *ctx)
|
||||||
void ath_chanctx_init(struct ath_softc *sc);
|
void ath_chanctx_init(struct ath_softc *sc);
|
||||||
void ath_chanctx_set_channel(struct ath_softc *sc, struct ath_chanctx *ctx,
|
void ath_chanctx_set_channel(struct ath_softc *sc, struct ath_chanctx *ctx,
|
||||||
struct cfg80211_chan_def *chandef);
|
struct cfg80211_chan_def *chandef);
|
||||||
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx);
|
|
||||||
|
|
||||||
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
|
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
|
||||||
bool ath9k_is_chanctx_enabled(void);
|
bool ath9k_is_chanctx_enabled(void);
|
||||||
void ath9k_fill_chanctx_ops(void);
|
void ath9k_fill_chanctx_ops(void);
|
||||||
|
@ -434,6 +432,7 @@ void ath9k_p2p_bss_info_changed(struct ath_softc *sc,
|
||||||
struct ieee80211_vif *vif);
|
struct ieee80211_vif *vif);
|
||||||
void ath9k_p2p_ps_timer(void *priv);
|
void ath9k_p2p_ps_timer(void *priv);
|
||||||
void ath9k_chanctx_wake_queues(struct ath_softc *sc);
|
void ath9k_chanctx_wake_queues(struct ath_softc *sc);
|
||||||
|
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx);
|
||||||
|
|
||||||
void ath_chanctx_beacon_recv_ev(struct ath_softc *sc, u32 ts,
|
void ath_chanctx_beacon_recv_ev(struct ath_softc *sc, u32 ts,
|
||||||
enum ath_chanctx_event ev);
|
enum ath_chanctx_event ev);
|
||||||
|
@ -499,6 +498,10 @@ static inline void ath9k_p2p_ps_timer(struct ath_softc *sc)
|
||||||
static inline void ath9k_chanctx_wake_queues(struct ath_softc *sc)
|
static inline void ath9k_chanctx_wake_queues(struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
static inline void ath_chanctx_check_active(struct ath_softc *sc,
|
||||||
|
struct ath_chanctx *ctx)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */
|
#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */
|
||||||
|
|
||||||
int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan);
|
int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan);
|
||||||
|
|
|
@ -101,51 +101,6 @@ static int ath_set_channel(struct ath_softc *sc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
|
|
||||||
{
|
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
|
||||||
struct ath_vif *avp;
|
|
||||||
bool active = false;
|
|
||||||
u8 n_active = 0;
|
|
||||||
|
|
||||||
if (!ctx)
|
|
||||||
return;
|
|
||||||
|
|
||||||
list_for_each_entry(avp, &ctx->vifs, list) {
|
|
||||||
struct ieee80211_vif *vif = avp->vif;
|
|
||||||
|
|
||||||
switch (vif->type) {
|
|
||||||
case NL80211_IFTYPE_P2P_CLIENT:
|
|
||||||
case NL80211_IFTYPE_STATION:
|
|
||||||
if (vif->bss_conf.assoc)
|
|
||||||
active = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
active = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ctx->active = active;
|
|
||||||
|
|
||||||
ath_for_each_chanctx(sc, ctx) {
|
|
||||||
if (!ctx->assigned || list_empty(&ctx->vifs))
|
|
||||||
continue;
|
|
||||||
n_active++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n_active <= 1) {
|
|
||||||
clear_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (test_and_set_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ath9k_is_chanctx_enabled()) {
|
|
||||||
ath_chanctx_event(sc, NULL,
|
|
||||||
ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ath_chanctx_init(struct ath_softc *sc)
|
void ath_chanctx_init(struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
struct ath_chanctx *ctx;
|
struct ath_chanctx *ctx;
|
||||||
|
@ -209,6 +164,51 @@ static const char *offchannel_state_string(enum ath_offchannel_state state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
|
||||||
|
{
|
||||||
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
|
struct ath_vif *avp;
|
||||||
|
bool active = false;
|
||||||
|
u8 n_active = 0;
|
||||||
|
|
||||||
|
if (!ctx)
|
||||||
|
return;
|
||||||
|
|
||||||
|
list_for_each_entry(avp, &ctx->vifs, list) {
|
||||||
|
struct ieee80211_vif *vif = avp->vif;
|
||||||
|
|
||||||
|
switch (vif->type) {
|
||||||
|
case NL80211_IFTYPE_P2P_CLIENT:
|
||||||
|
case NL80211_IFTYPE_STATION:
|
||||||
|
if (vif->bss_conf.assoc)
|
||||||
|
active = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
active = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx->active = active;
|
||||||
|
|
||||||
|
ath_for_each_chanctx(sc, ctx) {
|
||||||
|
if (!ctx->assigned || list_empty(&ctx->vifs))
|
||||||
|
continue;
|
||||||
|
n_active++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_active <= 1) {
|
||||||
|
clear_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (test_and_set_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ath9k_is_chanctx_enabled()) {
|
||||||
|
ath_chanctx_event(sc, NULL,
|
||||||
|
ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct ath_chanctx *
|
static struct ath_chanctx *
|
||||||
ath_chanctx_get_next(struct ath_softc *sc, struct ath_chanctx *ctx)
|
ath_chanctx_get_next(struct ath_softc *sc, struct ath_chanctx *ctx)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue