2015-06-10 05:03:30

by Janusz Dziedzic

[permalink] [raw]
Subject: [RFC] ath9k: allow to receive probe request when offchannel

This fix problem that p2p group negotiation didn't work
correctly when chanctx used, because we didn't receive
probe requests when offchannel and use_chanctx=1

Signed-off-by: Janusz Dziedzic <[email protected]>
---
@Felix, Sujith could you review? I am not sure I put this in correct place.

drivers/net/wireless/ath/ath9k/channel.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
index 2066650..6301d44 100644
--- a/drivers/net/wireless/ath/ath9k/channel.c
+++ b/drivers/net/wireless/ath/ath9k/channel.c
@@ -1157,6 +1157,7 @@ static bool ath_chanctx_defer_switch(struct ath_softc *sc)
static void ath_offchannel_channel_change(struct ath_softc *sc)
{
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+ u32 rfilt;

ath_dbg(common, CHAN_CTX, "%s: offchannel state: %s\n",
__func__, offchannel_state_string(sc->offchannel.state));
@@ -1179,6 +1180,11 @@ static void ath_offchannel_channel_change(struct ath_softc *sc)
ath_scan_complete(sc, false);
break;
case ATH_OFFCHANNEL_ROC_START:
+ /* Allow to receive probe requests */
+ rfilt = ath_calcrxfilter(sc);
+ rfilt |= ATH9K_RX_FILTER_PROBEREQ;
+ ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
+
if (sc->cur_chan != &sc->offchannel.chan)
break;

--
1.9.1



2015-06-15 11:47:05

by Felix Fietkau

[permalink] [raw]
Subject: Re: [RFC] ath9k: allow to receive probe request when offchannel

On 2015-06-10 07:03, Janusz Dziedzic wrote:
> This fix problem that p2p group negotiation didn't work
> correctly when chanctx used, because we didn't receive
> probe requests when offchannel and use_chanctx=1
>
> Signed-off-by: Janusz Dziedzic <[email protected]>
> ---
> @Felix, Sujith could you review? I am not sure I put this in correct place.
>
> drivers/net/wireless/ath/ath9k/channel.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
> index 2066650..6301d44 100644
> --- a/drivers/net/wireless/ath/ath9k/channel.c
> +++ b/drivers/net/wireless/ath/ath9k/channel.c
> @@ -1157,6 +1157,7 @@ static bool ath_chanctx_defer_switch(struct ath_softc *sc)
> static void ath_offchannel_channel_change(struct ath_softc *sc)
> {
> struct ath_common *common = ath9k_hw_common(sc->sc_ah);
> + u32 rfilt;
>
> ath_dbg(common, CHAN_CTX, "%s: offchannel state: %s\n",
> __func__, offchannel_state_string(sc->offchannel.state));
> @@ -1179,6 +1180,11 @@ static void ath_offchannel_channel_change(struct ath_softc *sc)
> ath_scan_complete(sc, false);
> break;
> case ATH_OFFCHANNEL_ROC_START:
> + /* Allow to receive probe requests */
> + rfilt = ath_calcrxfilter(sc);
> + rfilt |= ATH9K_RX_FILTER_PROBEREQ;
I think ath_calcrxfilter should set this, otherwise it might be
overwritten, e.g. on BB watchdog reset.

- Felix

2015-06-15 12:25:45

by Sujith Manoharan

[permalink] [raw]
Subject: Re: [RFC] ath9k: allow to receive probe request when offchannel

Janusz Dziedzic wrote:
> > case ATH_OFFCHANNEL_ROC_START:
> > + /* Allow to receive probe requests */
> > + rfilt = ath_calcrxfilter(sc);
> > + rfilt |= ATH9K_RX_FILTER_PROBEREQ;
> > + ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
> > +

ath9k_set_offchannel_state() would be a better place to do this,
since setting up various bits in the HW for offchannel operation
is done there. Also, it would make sure that the HW state is
retained when a chip reset is done for some reason.

Sujith

2015-06-15 11:39:27

by Janusz Dziedzic

[permalink] [raw]
Subject: Re: [RFC] ath9k: allow to receive probe request when offchannel

adding Sujith correct mail

On 10 June 2015 at 07:03, Janusz Dziedzic <[email protected]> wrote:
> This fix problem that p2p group negotiation didn't work
> correctly when chanctx used, because we didn't receive
> probe requests when offchannel and use_chanctx=1
>
> Signed-off-by: Janusz Dziedzic <[email protected]>
> ---
> @Felix, Sujith could you review? I am not sure I put this in correct place.
>
> drivers/net/wireless/ath/ath9k/channel.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
> index 2066650..6301d44 100644
> --- a/drivers/net/wireless/ath/ath9k/channel.c
> +++ b/drivers/net/wireless/ath/ath9k/channel.c
> @@ -1157,6 +1157,7 @@ static bool ath_chanctx_defer_switch(struct ath_softc *sc)
> static void ath_offchannel_channel_change(struct ath_softc *sc)
> {
> struct ath_common *common = ath9k_hw_common(sc->sc_ah);
> + u32 rfilt;
>
> ath_dbg(common, CHAN_CTX, "%s: offchannel state: %s\n",
> __func__, offchannel_state_string(sc->offchannel.state));
> @@ -1179,6 +1180,11 @@ static void ath_offchannel_channel_change(struct ath_softc *sc)
> ath_scan_complete(sc, false);
> break;
> case ATH_OFFCHANNEL_ROC_START:
> + /* Allow to receive probe requests */
> + rfilt = ath_calcrxfilter(sc);
> + rfilt |= ATH9K_RX_FILTER_PROBEREQ;
> + ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
> +
> if (sc->cur_chan != &sc->offchannel.chan)
> break;
>
> --
> 1.9.1
>