2008-10-26 17:52:46

by Elias Oltmanns

[permalink] [raw]
Subject: Re: [PATCH] ath5k: Fix reset sequence for AR5212 in general and RF5111 in particular

[Bcc'ing Nils who has reported similar issues with ath5k on 2.6.27.
Nils, can you perhaps test my patch below and report back? ]

"Nick Kossifidis" <[email protected]> wrote:
> 2008/10/23 Elias Oltmanns <[email protected]>:
>> Take care to handle register 0xa228 exactly as in the HAL released by
>
>> Atheros. This change is required to make ath5k work again on my system
>> since commit 2203d6be (ath5k: Misc hw_reset updates), thus fixing a
>> regression in 2.6.27 and therefore hopefully eligible for inclusion into
>> a stable release.
>>
>> Cc: stable <[email protected]>
>> Signed-off-by: Elias Oltmanns <[email protected]>
>> ---
>> Applies to 2.6.27. Please let me know if I should do something
>> differently and resend.
>>
>> drivers/net/wireless/ath5k/hw.c | 1 +
>> drivers/net/wireless/ath5k/initvals.c | 2 ++
>> 2 files changed, 3 insertions(+), 0 deletions(-)
>>
>
> Current code works fine on my CM6 (AR5212 + RF5111) and i see nothing like
>
> data |= 0x00000800
>
> on the HAL Atheros released

Let me quote from legacy-hal:

ar5212/ar5212_reset.c:
373: OS_REG_RMW_FIELD(ah, AR_PHY_DAG_CTRLCCK,
374: AR_PHY_DAG_CTRLCCK_RSSI_THR, 2);

ah_internal.h:
598: #define OS_REG_RMW_FIELD(_a, _r, _f, _v) \
599: OS_REG_WRITE(_a, _r, \
600: (OS_REG_READ(_a, _r) &~ _f) | (((_v) << _f##_S) & _f))

Please note the last argument to OS_REG_RMW_FIELD() which is 2 in this
case. Unless I've made a mistake, this translates into the

data |= 0x00000800;

in my patch.

There definitely is no way for me to connect to an ap (or even get a
list of aps) with current 2.6.27.4. Perhaps we'll hear something from
Nils on that matter too.

>
> Problem is that we are updating 0xa228 (RSSI threshold in this case)
> for all AR5212 based cards and we are not checking right now for BB
> revision. These settings according to Atheros HAL are only for BB
> revisions > 2. I'm going to update reset.c this week hopefully.
>
> BTW can you please run latest ath_info on your card ? Let's see what's
> the rssi threshold stored on EEPROM and how much different is from my
> card.

Well, I don't see how to get that information from the dump. Please have
a look for yourself, I'm going to send you my dump by pm.

Since my original email has not appeared on linux-wireless (due to a
mistake of mine), I'm attaching the patch again, so others can have a
look at it and, more importantly, Nils can test it.

Regards,

Elias

--------
From: Elias Oltmanns <[email protected]>
Subject: [PATCH] ath5k: Fix reset sequence for AR5212 in general and RF5111 in particular

Take care to handle register 0xa228 exactly as in the HAL released by
Atheros. This change is required to make ath5k work again on my system
since commit 2203d6be (ath5k: Misc hw_reset updates), thus fixing a
regression in 2.6.27 and therefore hopefully eligible for inclusion into
a stable release.

Cc: stable <[email protected]>
Signed-off-by: Elias Oltmanns <[email protected]>
---

drivers/net/wireless/ath5k/hw.c | 1 +
drivers/net/wireless/ath5k/initvals.c | 2 ++
2 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c
index ad1a5b4..f1a7f71 100644
--- a/drivers/net/wireless/ath5k/hw.c
+++ b/drivers/net/wireless/ath5k/hw.c
@@ -858,6 +858,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode,

data = ath5k_hw_reg_read(ah, 0xa228);
data &= 0xfffe03ff;
+ data |= 0x00000800;
ath5k_hw_reg_write(ah, data, 0xa228);
data = 0;

diff --git a/drivers/net/wireless/ath5k/initvals.c b/drivers/net/wireless/ath5k/initvals.c
index 2806b21..cf7ebd1 100644
--- a/drivers/net/wireless/ath5k/initvals.c
+++ b/drivers/net/wireless/ath5k/initvals.c
@@ -810,6 +810,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = {
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
{ AR5K_PHY(642),
{ 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
+ { 0xa228,
+ { 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
{ 0xa23c,
{ 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
};


2008-10-26 18:32:39

by Nick Kossifidis

[permalink] [raw]
Subject: Re: [PATCH] ath5k: Fix reset sequence for AR5212 in general and RF5111 in particular

2008/10/26 Elias Oltmanns <[email protected]>:
>
> Let me quote from legacy-hal:
>
> ar5212/ar5212_reset.c:
> 373: OS_REG_RMW_FIELD(ah, AR_PHY_DAG_CTRLCCK,
> 374: AR_PHY_DAG_CTRLCCK_RSSI_THR, 2);
>
> ah_internal.h:
> 598: #define OS_REG_RMW_FIELD(_a, _r, _f, _v) \
> 599: OS_REG_WRITE(_a, _r, \
> 600: (OS_REG_READ(_a, _r) &~ _f) | (((_v) << _f##_S) & _f))
>
> Please note the last argument to OS_REG_RMW_FIELD() which is 2 in this
> case. Unless I've made a mistake, this translates into the
>
> data |= 0x00000800;
>
> in my patch.
>
> There definitely is no way for me to connect to an ap (or even get a
> list of aps) with current 2.6.27.4. Perhaps we'll hear something from
> Nils on that matter too.
>

Some lines above...

/* Overwrite INI values for revised chipsets */
if (AH_PRIVATE(ah)->ah_phyRev >= AR_PHY_CHIP_ID_REV_2) {

so

/* Add barker RSSI thresh enable as disabled */
OS_REG_CLR_BIT(ah, AR_PHY_DAG_CTRLCCK,
AR_PHY_DAG_CTRLCCK_EN_RSSI_THR);
OS_REG_RMW_FIELD(ah, AR_PHY_DAG_CTRLCCK,
AR_PHY_DAG_CTRLCCK_RSSI_THR, 2);

is for phy (BB) revisions > 2 since you have RF5111 this code should
not run but (and here is our bug) instead of checking bb revision we
run this code for all AR5212 chips

/*
* Write some more initial register settings
*/
if (ah->ah_version == AR5K_AR5212) {

> --- a/drivers/net/wireless/ath5k/initvals.c
> +++ b/drivers/net/wireless/ath5k/initvals.c
> @@ -810,6 +810,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = {
> { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
> { AR5K_PHY(642),
> { 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
> + { 0xa228,
> + { 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
> { 0xa23c,
> { 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
> };
>

This chunk is correct

So can you please change the check on ath5k_hw_reset + add initial
rssi threshold setting and retry ?


--
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick

2008-10-27 18:36:28

by Nils

[permalink] [raw]
Subject: Re: [PATCH] ath5k: Fix reset sequence for AR5212 in general and RF5111 in particular

> [Bcc'ing Nils who has reported similar issues with ath5k on 2.6.27.
> Nils, can you perhaps test my patch below and report back? ]

Yes! I test the patch with 2.6.27.4 and everything works fine.

"iwlist ath0 scan" shows all wireless LANs at my location and I can connect to
my accesspoint.

Thanks,
Nils


> "Nick Kossifidis" <[email protected]> wrote:
> > 2008/10/23 Elias Oltmanns <[email protected]>:
> >> Take care to handle register 0xa228 exactly as in the HAL released by
> >>
> >> Atheros. This change is required to make ath5k work again on my system
> >> since commit 2203d6be (ath5k: Misc hw_reset updates), thus fixing a
> >> regression in 2.6.27 and therefore hopefully eligible for inclusion into
> >> a stable release.
> >>
> >> Cc: stable <[email protected]>
> >> Signed-off-by: Elias Oltmanns <[email protected]>
> >> ---
> >> Applies to 2.6.27. Please let me know if I should do something
> >> differently and resend.
> >>
> >> drivers/net/wireless/ath5k/hw.c | 1 +
> >> drivers/net/wireless/ath5k/initvals.c | 2 ++
> >> 2 files changed, 3 insertions(+), 0 deletions(-)
> >
> > Current code works fine on my CM6 (AR5212 + RF5111) and i see nothing
> > like
> >
> > data |= 0x00000800
> >
> > on the HAL Atheros released
>
> Let me quote from legacy-hal:
>
> ar5212/ar5212_reset.c:
> 373: OS_REG_RMW_FIELD(ah, AR_PHY_DAG_CTRLCCK,
> 374: AR_PHY_DAG_CTRLCCK_RSSI_THR, 2);
>
> ah_internal.h:
> 598: #define OS_REG_RMW_FIELD(_a, _r, _f, _v) \
> 599: OS_REG_WRITE(_a, _r, \
> 600: (OS_REG_READ(_a, _r) &~ _f) | (((_v) << _f##_S) & _f))
>
> Please note the last argument to OS_REG_RMW_FIELD() which is 2 in this
> case. Unless I've made a mistake, this translates into the
>
> data |= 0x00000800;
>
> in my patch.
>
> There definitely is no way for me to connect to an ap (or even get a
> list of aps) with current 2.6.27.4. Perhaps we'll hear something from
> Nils on that matter too.
>
> > Problem is that we are updating 0xa228 (RSSI threshold in this case)
> > for all AR5212 based cards and we are not checking right now for BB
> > revision. These settings according to Atheros HAL are only for BB
> > revisions > 2. I'm going to update reset.c this week hopefully.
> >
> > BTW can you please run latest ath_info on your card ? Let's see what's
> > the rssi threshold stored on EEPROM and how much different is from my
> > card.
>
> Well, I don't see how to get that information from the dump. Please have
> a look for yourself, I'm going to send you my dump by pm.
>
> Since my original email has not appeared on linux-wireless (due to a
> mistake of mine), I'm attaching the patch again, so others can have a
> look at it and, more importantly, Nils can test it.
>
> Regards,
>
> Elias
>
> --------
> From: Elias Oltmanns <[email protected]>
> Subject: [PATCH] ath5k: Fix reset sequence for AR5212 in general and RF5111
> in particular
>
> Take care to handle register 0xa228 exactly as in the HAL released by
> Atheros. This change is required to make ath5k work again on my system
> since commit 2203d6be (ath5k: Misc hw_reset updates), thus fixing a
> regression in 2.6.27 and therefore hopefully eligible for inclusion into
> a stable release.
>
> Cc: stable <[email protected]>
> Signed-off-by: Elias Oltmanns <[email protected]>
> ---
>
> drivers/net/wireless/ath5k/hw.c | 1 +
> drivers/net/wireless/ath5k/initvals.c | 2 ++
> 2 files changed, 3 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/ath5k/hw.c
> b/drivers/net/wireless/ath5k/hw.c index ad1a5b4..f1a7f71 100644
> --- a/drivers/net/wireless/ath5k/hw.c
> +++ b/drivers/net/wireless/ath5k/hw.c
> @@ -858,6 +858,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum
> ieee80211_if_types op_mode,
>
> data = ath5k_hw_reg_read(ah, 0xa228);
> data &= 0xfffe03ff;
> + data |= 0x00000800;
> ath5k_hw_reg_write(ah, data, 0xa228);
> data = 0;
>
> diff --git a/drivers/net/wireless/ath5k/initvals.c
> b/drivers/net/wireless/ath5k/initvals.c index 2806b21..cf7ebd1 100644
> --- a/drivers/net/wireless/ath5k/initvals.c
> +++ b/drivers/net/wireless/ath5k/initvals.c
> @@ -810,6 +810,8 @@ static const struct ath5k_ini_mode
> ar5212_rf5111_ini_mode_end[] = { { 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000 } }, { AR5K_PHY(642),
> { 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
> + { 0xa228,
> + { 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
> { 0xa23c,
> { 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
> };