2010-12-22 13:47:59

by Senthil Balasubramanian

[permalink] [raw]
Subject: [PATCH v2 1/2] ath9k_hw: Fix incorrect macversion and macrev checks

There are few places where we are checking for macversion and revsions
before RTC is powered ON. However we are reading the macversion and
revisions only after RTC is powered ON and so both macversion and
revisions are actully zero and this leads to incorrect srev checks.

fix this by reading the macversion and revisisons even before we start
using them. There is no reason why should we delay reading this info
until RTC is powered on as this is just a register information.

Cc: Stable Kernel <[email protected]>
Signed-off-by: Senthil Balasubramanian <[email protected]>
---
v2 -- fixed reading revisions unnecessarily during every reset.

drivers/net/wireless/ath/ath9k/hw.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 4b51ed4..0a0ba80 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -491,6 +491,8 @@ static int __ath9k_hw_init(struct ath_hw *ah)
if (ah->hw_version.devid == AR5416_AR9100_DEVID)
ah->hw_version.macVersion = AR_SREV_VERSION_9100;

+ ath9k_hw_read_revisions(ah);
+
if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
ath_err(common, "Couldn't reset chip\n");
return -EIO;
@@ -1078,8 +1080,6 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
return false;
}

- ath9k_hw_read_revisions(ah);
-
return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
}

--
1.7.3.4



2010-12-22 13:48:06

by Senthil Balasubramanian

[permalink] [raw]
Subject: [PATCH v2 2/2] ath9k_hw: read and backup AR_WA register value even before chip reset on.

We need to read and backup AR_WA register value permanently and reading
this after the chip is awakened results in this register being zeroed out.

This seems to fix the ASPM with L1 enabled issue that we have observed.
The laptop becomes very slow and hangs mostly with ASPM L1 enabled without
this fix.

Cc: Stable Kernel <[email protected]>
Signed-off-by: Senthil Balasubramanian <[email protected]>
---
drivers/net/wireless/ath/ath9k/hw.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 0a0ba80..e3cec2b 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -493,6 +493,15 @@ static int __ath9k_hw_init(struct ath_hw *ah)

ath9k_hw_read_revisions(ah);

+ /*
+ * Read back AR_WA into a permanent copy and set bits 14 and 17.
+ * We need to do this to avoid RMW of this register. We cannot
+ * read the reg when chip is asleep.
+ */
+ ah->WARegVal = REG_READ(ah, AR_WA);
+ ah->WARegVal |= (AR_WA_D3_L1_DISABLE |
+ AR_WA_ASPM_TIMER_BASED_DISABLE);
+
if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
ath_err(common, "Couldn't reset chip\n");
return -EIO;
@@ -561,14 +570,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)

ath9k_hw_init_mode_regs(ah);

- /*
- * Read back AR_WA into a permanent copy and set bits 14 and 17.
- * We need to do this to avoid RMW of this register. We cannot
- * read the reg when chip is asleep.
- */
- ah->WARegVal = REG_READ(ah, AR_WA);
- ah->WARegVal |= (AR_WA_D3_L1_DISABLE |
- AR_WA_ASPM_TIMER_BASED_DISABLE);

if (ah->is_pciexpress)
ath9k_hw_configpcipowersave(ah, 0, 0);
--
1.7.3.4


2010-12-22 14:42:29

by Luis R. Rodriguez

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] ath9k_hw: Fix incorrect macversion and macrev checks

On Wed, Dec 22, 2010 at 8:47 AM, Senthil Balasubramanian
<[email protected]> wrote:
> There are few places where we are checking for macversion and revsions
> before RTC is powered ON. However we are reading the macversion and
> revisions only after RTC is powered ON and so both macversion and
> revisions are actully zero and this leads to incorrect srev checks.
>
> fix this by reading the macversion and revisisons even before we start
> using them. There is no reason why should we delay reading this info
> until RTC is powered on as this is just a register information.
>
> Cc: Stable Kernel <[email protected]>
> Signed-off-by: Senthil Balasubramanian <[email protected]>
> ---
> v2 -- fixed reading revisions unnecessarily during every reset.

The description can be extended explaining what specific real life
issues this fixes and can help in the evaluation for stable, consider
helping to the extend even Andi Kleen can read this and easily decide
to either suck this into 2.6.35 longterm or not. To help with this it
will help to know what chipsets are affected and so on. I suspect it
can say something like:

"This fixes programming the hardware incorrectly for x and y chipsets
where the wrong chipset was being picked up. Without this those
chipsets would be programmed incorrectly and would not be functional"

Luis