Patchwork ath5k: Disable fast channel switching by default

login
register
mail settings
Submitter Seth Forshee
Date June 17, 2011, 2:29 p.m.
Message ID <1308320962-19091-2-git-send-email-seth.forshee@canonical.com>
Download mbox | patch
Permalink /patch/100811/
State New
Headers show

Comments

Seth Forshee - June 17, 2011, 2:29 p.m.
From: Nick Kossifidis <mickflemm@gmail.com>

BugLink: http://bugs.launchpad.net/bugs/767192

Disable fast channel change by default on AR2413/AR5413 due to
some bug reports (it still works for me but it's better to be safe).
Add a module parameter "fastchanswitch" in case anyone wants to enable
it and play with it.

Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
(backported from commit a99168eece601d2a79ecfcb968ce226f2f30cf98 upstream)

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
---
 drivers/net/wireless/ath/ath5k/base.c  |   11 ++++++++++-
 drivers/net/wireless/ath/ath5k/reset.c |    5 ++++-
 2 files changed, 14 insertions(+), 2 deletions(-)
Herton Ronaldo Krzesinski - June 17, 2011, 3:40 p.m.
On Fri, Jun 17, 2011 at 09:29:22AM -0500, Seth Forshee wrote:
> From: Nick Kossifidis <mickflemm@gmail.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/767192
> 
> Disable fast channel change by default on AR2413/AR5413 due to
> some bug reports (it still works for me but it's better to be safe).
> Add a module parameter "fastchanswitch" in case anyone wants to enable
> it and play with it.
> 
> Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
> Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> (backported from commit a99168eece601d2a79ecfcb968ce226f2f30cf98 upstream)
> 
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> ---
>  drivers/net/wireless/ath/ath5k/base.c  |   11 ++++++++++-
>  drivers/net/wireless/ath/ath5k/reset.c |    5 ++++-
>  2 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index 09ae4ef..f6814f0 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -69,6 +69,11 @@ static int modparam_all_channels;
>  module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO);
>  MODULE_PARM_DESC(all_channels, "Expose all channels the device can use.");
>  
> +static int modparam_fastchanswitch;
> +module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO);
> +MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios.");
> +
> +
>  /* Module info */
>  MODULE_AUTHOR("Jiri Slaby");
>  MODULE_AUTHOR("Nick Kossifidis");
> @@ -2664,6 +2669,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
>  	struct ath5k_hw *ah = sc->ah;
>  	struct ath_common *common = ath5k_hw_common(ah);
>  	int ret, ani_mode;
> +	bool fast;
>  
>  	ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");
>  
> @@ -2685,7 +2691,10 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
>  		sc->curchan = chan;
>  		sc->curband = &sc->sbands[chan->band];
>  	}
> -	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL,
> +
> +	fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0;
> +
> +	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, fast,
>  								skip_pcu);
>  	if (ret) {
>  		ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
> diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
> index 8420689..6f53d2b 100644
> --- a/drivers/net/wireless/ath/ath5k/reset.c
> +++ b/drivers/net/wireless/ath/ath5k/reset.c
> @@ -1119,8 +1119,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
>  			/* Non fatal, can happen eg.
>  			 * on mode change */
>  			ret = 0;
> -		} else
> +		} else {
> +			ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_RESET,
> +				"fast chan change successful\n");
>  			return 0;
> +		}
>  	}
>  
>  	/*

It looks ok, although from poking at bug 767192 it seems users tested
this with a 2.6.39 based build and not the natty kernel. But the bug
which this fixes is on 2.6.38 too, others confirmed this fix, and the SRU
process will require verification of this anyway. Also, the fix is simple and a
lot of users seems hitting it so:

Acked-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>

> -- 
> 1.7.4.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
Andy Whitcroft - June 17, 2011, 4:40 p.m.
On Fri, Jun 17, 2011 at 09:29:22AM -0500, Seth Forshee wrote:
> From: Nick Kossifidis <mickflemm@gmail.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/767192
> 
> Disable fast channel change by default on AR2413/AR5413 due to
> some bug reports (it still works for me but it's better to be safe).
> Add a module parameter "fastchanswitch" in case anyone wants to enable
> it and play with it.
> 
> Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
> Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> (backported from commit a99168eece601d2a79ecfcb968ce226f2f30cf98 upstream)
> 
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> ---
>  drivers/net/wireless/ath/ath5k/base.c  |   11 ++++++++++-
>  drivers/net/wireless/ath/ath5k/reset.c |    5 ++++- >  2 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index 09ae4ef..f6814f0 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -69,6 +69,11 @@ static int modparam_all_channels;
>  module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO);
>  MODULE_PARM_DESC(all_channels, "Expose all channels the device can use.");
>  
> +static int modparam_fastchanswitch;
> +module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO);
> +MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios.");
> +
> +
>  /* Module info */
>  MODULE_AUTHOR("Jiri Slaby");
>  MODULE_AUTHOR("Nick Kossifidis");
> @@ -2664,6 +2669,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
>  	struct ath5k_hw *ah = sc->ah;
>  	struct ath_common *common = ath5k_hw_common(ah);
>  	int ret, ani_mode;
> +	bool fast;
>  
>  	ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");
>  
> @@ -2685,7 +2691,10 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
>  		sc->curchan = chan;
>  		sc->curband = &sc->sbands[chan->band];
>  	}
> -	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL,
> +
> +	fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0;

I suspect this could just be:

	fast = ((chan != NULL) && modparam_fastchanswitch);

but I assume that matches upstream, so don't change it.

> +
> +	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, fast,
>  								skip_pcu);
>  	if (ret) {
>  		ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
> diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
> index 8420689..6f53d2b 100644
> --- a/drivers/net/wireless/ath/ath5k/reset.c
> +++ b/drivers/net/wireless/ath/ath5k/reset.c
> @@ -1119,8 +1119,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
>  			/* Non fatal, can happen eg.
>  			 * on mode change */
>  			ret = 0;
> -		} else
> +		} else {
> +			ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_RESET,
> +				"fast chan change successful\n");
>  			return 0;
> +		}
>  	}

Otherwise it looks to do what it says and be pretty small and clear, so:

Acked-by: Andy Whitcroft <apw@canonical.com>

-apw

Patch

diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 09ae4ef..f6814f0 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -69,6 +69,11 @@  static int modparam_all_channels;
 module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO);
 MODULE_PARM_DESC(all_channels, "Expose all channels the device can use.");
 
+static int modparam_fastchanswitch;
+module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO);
+MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios.");
+
+
 /* Module info */
 MODULE_AUTHOR("Jiri Slaby");
 MODULE_AUTHOR("Nick Kossifidis");
@@ -2664,6 +2669,7 @@  ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
 	struct ath5k_hw *ah = sc->ah;
 	struct ath_common *common = ath5k_hw_common(ah);
 	int ret, ani_mode;
+	bool fast;
 
 	ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");
 
@@ -2685,7 +2691,10 @@  ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
 		sc->curchan = chan;
 		sc->curband = &sc->sbands[chan->band];
 	}
-	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL,
+
+	fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0;
+
+	ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, fast,
 								skip_pcu);
 	if (ret) {
 		ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
index 8420689..6f53d2b 100644
--- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c
@@ -1119,8 +1119,11 @@  int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
 			/* Non fatal, can happen eg.
 			 * on mode change */
 			ret = 0;
-		} else
+		} else {
+			ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_RESET,
+				"fast chan change successful\n");
 			return 0;
+		}
 	}
 
 	/*