ath9k: advertise p2p dev support when chanctx
PATCH v3 1/4 ath9k: advertise p2p dev support when chanctx
Advertise p2p device support when ath9k loaded with use_chanctx=1.
This will fix problem, when first interface is an AP and next we would like to run p2p_find. Before p2p find (scan phase) failed with EOPNOTSUPP.
--- drivers/net/wireless/ath/ath9k/init.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/init.c +6 -1
@@ -736,13 +736,14 @@ static const struct ieee80211_iface_limit if_limits_multi[] = {BIT (NL80211_IFTYPE_P2P_CLIENT ) | BIT(NL80211_IFTYPE_P2P_GO) }, { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) }, + { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_DEVICE) }, };static const struct ieee80211_iface_combination if_comb_multi[] = { { .limits = if_limits_multi, .n_limits =ARRAY_SIZE (if_limits_multi), - .max_interfaces =2 , + .max_interfaces =3 , .num_different_channels =2 , .beacon_int_infra_match = true, },
@@ -855,6 +856,10 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)BIT (NL80211_IFTYPE_MESH_POINT ) |BIT (NL80211_IFTYPE_WDS ); +if (ath9k_is_chanctx_enabled ()) + hw->wiphy->interface_modes |= +BIT (NL80211_IFTYPE_P2P_DEVICE ); + hw->wiphy->iface_combinations = if_comb; hw->wiphy->n_iface_combinations =ARRAY_SIZE (if_comb); }
Signature · 1 line
1.9.1
PATCH v3 2/4 ath9k: handle RoC cancel correctly
In case we will get ROC cancel from mac80211 we should not call ieee80211_remain_on_channel_expired().
In other case I hit such warning on MIPS and p2p negotiation failed (tested with use_chanctx=1).
ath: phy0: Starting RoC period
ath: phy0: Channel definition created: 2412 MHz
ath: phy0: Assigned next_chan to 2412 MHz
ath: phy0: Offchannel duration for chan 2412 MHz : 506632
ath: phy0: ath_chanctx_set_next: current: 2412 MHz, next: 2412 MHz
ath: phy0: Stopping current chanctx: 2412
ath: phy0: Flush timeout: 200
ath: phy0: ath_chanctx_set_next: Set channel 2412 MHz
ath: phy0: Set channel: 2412 MHz width: 0
ath: phy0: Reset to 2412 MHz, HT40: 0 fastcc: 0
ath: phy0: cur_chan: 2412 MHz, event: ATH_CHANCTX_EVENT_TSF_TIMER, state: ATH_CHANCTX_STATE_IDLE
ath: phy0: ath_offchannel_channel_change: offchannel state: ATH_OFFCHANNEL_ROC_START
ath: phy0: cur_chan: 2412 MHz, event: ATH_CHANCTX_EVENT_SWITCH, state: ATH_CHANCTX_STATE_IDLE
ath: phy0: Cancel RoC
ath: phy0: RoC aborted
ath: phy0: RoC request on vif: 00:03:7f:4e:a0:cd, type: 1 duration: 500
ath: phy0: Starting RoC period
ath: phy0: Channel definition created: 2412 MHz
ath: phy0: Assigned next_chan to 2412 MHz
ath: phy0: Offchannel duration for chan 2412 MHz : 506705
ath: phy0: ath_chanctx_set_next: current: 2412 MHz, next: 2412 MHz
ath: phy0: ath_offchannel_channel_change: offchannel state: ATH_OFFCHANNEL_ROC_START
ath: phy0: cur_chan: 2412 MHz, event: ATH_CHANCTX_EVENT_SWITCH, state: ATH_CHANCTX_STATE_IDLE
------------[ cut here ]------------ WARNING: CPU: 0 PID: 3312 at drivers/net/wireless/ath/ath9k/main.c:2319 Modules linked in: ath9k ath9k_common ath9k_hw ath mac80211 cfg80211
--- drivers/net/wireless/ath/ath9k/ath9k.h | 9 ++++++++- drivers/net/wireless/ath/ath9k/channel.c | 23 ++++++++++++++++------- drivers/net/wireless/ath/ath9k/main.c | 4 ++-- 3 files changed, 26 insertions(+), 10 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +8 -1
@@ -410,6 +410,12 @@ enum ath_offchannel_state { ATH_OFFCHANNEL_ROC_DONE, }; +enum ath_roc_complete_reason { +ATH_ROC_COMPLETE_EXPIRE , +ATH_ROC_COMPLETE_ABORT , +ATH_ROC_COMPLETE_CANCEL , +}; +struct ath_offchannel {struct ath_chanctx chan;struct timer_list timer;
@@ -471,7 +477,8 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,void ath_chanctx_set_next (struct ath_softc *sc,bool force);void ath_offchannel_next (struct ath_softc *sc);void ath_scan_complete (struct ath_softc *sc,bool abort); -void ath_roc_complete (struct ath_softc *sc,bool abort); +void ath_roc_complete (struct ath_softc *sc, +enum ath_roc_complete_reason reason);struct ath_chanctx *ath_is_go_chanctx_present (struct ath_softc *sc);#else
drivers/net/wireless/ath/ath9k/channel.c +16 -7
@@ -915,18 +915,27 @@ void ath_offchannel_next(struct ath_softc *sc) } } -void ath_roc_complete (struct ath_softc *sc,bool abort) +void ath_roc_complete (struct ath_softc *sc,enum ath_roc_complete_reason reason) {struct ath_common *common =ath9k_hw_common (sc->sc_ah); -if (abort) + sc->offchannel.roc_vif =NULL ; + sc->offchannel.roc_chan =NULL ; + +switch (reason) { +case ATH_ROC_COMPLETE_ABORT :ath_dbg (common,CHAN_CTX ,"RoC aborted\n" ); -else +ieee80211_remain_on_channel_expired (sc->hw); +break ; +case ATH_ROC_COMPLETE_EXPIRE :ath_dbg (common,CHAN_CTX ,"RoC expired\n" ); +ieee80211_remain_on_channel_expired (sc->hw); +break ; +case ATH_ROC_COMPLETE_CANCEL : +ath_dbg (common,CHAN_CTX ,"RoC canceled\n" ); +break ; + } - sc->offchannel.roc_vif =NULL ; - sc->offchannel.roc_chan =NULL ; -ieee80211_remain_on_channel_expired (sc->hw);ath_offchannel_next (sc);ath9k_ps_restore (sc); }
@@ -1058,7 +1067,7 @@ static void ath_offchannel_timer(unsigned long data)case ATH_OFFCHANNEL_ROC_START :case ATH_OFFCHANNEL_ROC_WAIT : sc->offchannel.state =ATH_OFFCHANNEL_ROC_DONE ; -ath_roc_complete (sc, false); +ath_roc_complete (sc,ATH_ROC_COMPLETE_EXPIRE );break ;default :break ;
drivers/net/wireless/ath/ath9k/main.c +2 -2
@@ -2246,7 +2246,7 @@ static void ath9k_cancel_pending_offchannel(struct ath_softc *sc)del_timer_sync (&sc->offchannel.timer);if (sc->offchannel.state >=ATH_OFFCHANNEL_ROC_START ) -ath_roc_complete (sc, true); +ath_roc_complete (sc,ATH_ROC_COMPLETE_ABORT ); }if (test_bit (ATH_OP_SCANNING , &common->op_flags)) {
@@ -2355,7 +2355,7 @@ static int ath9k_cancel_remain_on_channel(struct ieee80211_hw *hw)if (sc->offchannel.roc_vif) {if (sc->offchannel.state >=ATH_OFFCHANNEL_ROC_START ) -ath_roc_complete (sc, true); +ath_roc_complete (sc,ATH_ROC_COMPLETE_CANCEL ); }mutex_unlock (&sc->mutex);
Signature · 1 line
1.9.1
PATCH v3 3/4 ath9k: setup rxfilter for all chanctx
In reply to Janusz DziedzicWhile mac80211 setup this per HW, set same
rxfilter configuration for all chanctx.
--- drivers/net/wireless/ath/ath9k/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/main.c +3 -1
@@ -1459,13 +1459,15 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw, u64 multicast) {struct ath_softc *sc = hw->priv; +struct ath_chanctx *ctx;u32 rfilt; changed_flags &=SUPPORTED_FILTERS ; *total_flags &=SUPPORTED_FILTERS ;spin_lock_bh (&sc->chan_lock); - sc->cur_chan->rxfilter = *total_flags; +ath_for_each_chanctx (sc, ctx) + ctx->rxfilter = *total_flags;spin_unlock_bh (&sc->chan_lock);ath9k_ps_wakeup (sc);
Signature · 1 line
1.9.1
PATCH v3 4/4 ath9k: setup rxfilter when offchannel
In reply to Janusz DziedzicSetup rxfiler correctly for offchannel ctx.
This fix problem we didn't configure rxfilter, next didn't receive probe requests and next failed p2p_find. This was seen when ath9k loaded with use_chanctx=1
--- drivers/net/wireless/ath/ath9k/main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/ath/ath9k/main.c +3 -0
@@ -1468,6 +1468,9 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,spin_lock_bh (&sc->chan_lock);ath_for_each_chanctx (sc, ctx) ctx->rxfilter = *total_flags; +#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT + sc->offchannel.chan.rxfilter = *total_flags; +#endif spin_unlock_bh (&sc->chan_lock);ath9k_ps_wakeup (sc);
Signature · 1 line
1.9.1
PATCH v3 1/4 ath9k: advertise p2p dev support when chanctx
In reply to Janusz DziedzicQuoted 9 lines
Advertise p2p device support when ath9k loaded with use_chanctx=1.
This will fix problem, when first interface is an AP and next we would like to run
p2p_find. Before p2p find (scan phase) failed with EOPNOTSUPP.Signed-off-by Janusz Dziedzic <[email protected]>
Thanks, 4 patches applied to wireless-drivers-next.git:
eb61f9f623f7 ath9k: advertise p2p dev support when chanctx d83520b7cd6e ath9k: handle RoC cancel correctly f3771c08282a ath9k: setup rxfilter for all chanctx 1738203ee729 ath9k: setup rxfilter when offchannel
Kalle Valo