2013-04-15 03:29:54

by Alex Mihaylov

[permalink] [raw]
Subject: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards

From: "Alex A. Mihaylov" <[email protected]>

Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
value in them EEPROM/EFUSE. In this case, we must use default value,
but always used EEPROM/EFUSE value. As result we have tranmitt power
range from -10dBm to +6dBm instead 0dBm to +16dBm.

Correctly value in EEPROM/EFUSE is one or more for RT3070 and two or
more for other RT30xx chips.

Tested on Canyon CNP-WF518N1 usb Wi-Fi dongle and Jorjin WN8020 usb
embedded Wi-Fi module.

Signed-off-by: Alex A. Mihaylov <[email protected]>
Cc: [email protected]
---
drivers/net/wireless/rt2x00/rt2800lib.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index a658b4b..92849e5 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -4436,6 +4436,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)

if (!rt2x00_rt(rt2x00dev, RT5390) &&
!rt2x00_rt(rt2x00dev, RT5392)) {
+ u8 min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2;
+
rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -4446,8 +4448,10 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
&rt2x00dev->cap_flags))
rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
}
- rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
- drv_data->txmixer_gain_24g);
+ if (drv_data->txmixer_gain_24g >= min_gain) {
+ rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
+ drv_data->txmixer_gain_24g);
+ }
rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
}

--
1.8.1.5



2013-04-15 16:00:42

by Gertjan van Wingerde

[permalink] [raw]
Subject: Re: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards

On Mon, Apr 15, 2013 at 5:29 AM, <[email protected]> wrote:
> From: "Alex A. Mihaylov" <[email protected]>
>
> Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
> value in them EEPROM/EFUSE. In this case, we must use default value,
> but always used EEPROM/EFUSE value. As result we have tranmitt power
> range from -10dBm to +6dBm instead 0dBm to +16dBm.
>
> Correctly value in EEPROM/EFUSE is one or more for RT3070 and two or
> more for other RT30xx chips.
>
> Tested on Canyon CNP-WF518N1 usb Wi-Fi dongle and Jorjin WN8020 usb
> embedded Wi-Fi module.
>
> Signed-off-by: Alex A. Mihaylov <[email protected]>
> Cc: [email protected]

Acked-by: Gertjan van Wingerde <[email protected]>

> ---
> drivers/net/wireless/rt2x00/rt2800lib.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index a658b4b..92849e5 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -4436,6 +4436,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>
> if (!rt2x00_rt(rt2x00dev, RT5390) &&
> !rt2x00_rt(rt2x00dev, RT5392)) {
> + u8 min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2;
> +
> rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
> rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
> if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -4446,8 +4448,10 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
> &rt2x00dev->cap_flags))
> rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
> }
> - rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
> - drv_data->txmixer_gain_24g);
> + if (drv_data->txmixer_gain_24g >= min_gain) {
> + rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
> + drv_data->txmixer_gain_24g);
> + }
> rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
> }
>
> --
> 1.8.1.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html



--
---
Gertjan

2013-04-15 08:23:46

by Alex Mihaylov

[permalink] [raw]
Subject: RE: Re: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards


Good day!
> > From: "Alex A. Mihaylov" <[email protected]>
> > Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
> > value in them EEPROM/EFUSE. In this case, we must use default value,
> > but always used EEPROM/EFUSE value. As result we have tranmitt power
> > range from -10dBm to +6dBm instead 0dBm to +16dBm.

> > Signed-off-by: Alex A. Mihaylov <[email protected]>
> > diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c

> Could you explain how you have come to this patch?
> Is this behavior of the Ralink provided driver that you replicated
> here, or have you come to this approach in an other way?

Yes, vendor driver have this code in chips/rt3070.c (function NICInitRT3070RFRegisters) and chips/rt30xx.c (function RT30xxLoadRFNormalModeSetup) files.
Look like this:
[skipped]
if (pAd->TxMixerGain24G >= 2)
{
RFValue &= (~0x7); /* clean bit [2:0]*/
RFValue |= pAd->TxMixerGain24G;
}
RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
[skipped]
and have differents only in constants (2 in rt30xx.c and one in tr3070.c). TxPower i messaurment on power detector, connected directly to module.

2013-04-15 07:34:36

by Gertjan van Wingerde

[permalink] [raw]
Subject: Re: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards

On Mon, Apr 15, 2013 at 5:29 AM, <[email protected]> wrote:
> From: "Alex A. Mihaylov" <[email protected]>
>
> Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
> value in them EEPROM/EFUSE. In this case, we must use default value,
> but always used EEPROM/EFUSE value. As result we have tranmitt power
> range from -10dBm to +6dBm instead 0dBm to +16dBm.
>
> Correctly value in EEPROM/EFUSE is one or more for RT3070 and two or
> more for other RT30xx chips.
>
> Tested on Canyon CNP-WF518N1 usb Wi-Fi dongle and Jorjin WN8020 usb
> embedded Wi-Fi module.
>
> Signed-off-by: Alex A. Mihaylov <[email protected]>
> Cc: [email protected]
> ---
> drivers/net/wireless/rt2x00/rt2800lib.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index a658b4b..92849e5 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -4436,6 +4436,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>
> if (!rt2x00_rt(rt2x00dev, RT5390) &&
> !rt2x00_rt(rt2x00dev, RT5392)) {
> + u8 min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2;
> +
> rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
> rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
> if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -4446,8 +4448,10 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
> &rt2x00dev->cap_flags))
> rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
> }
> - rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
> - drv_data->txmixer_gain_24g);
> + if (drv_data->txmixer_gain_24g >= min_gain) {
> + rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
> + drv_data->txmixer_gain_24g);
> + }
> rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
> }
>

Could you explain how you have come to this patch?
Is this behavior of the Ralink provided driver that you replicated
here, or have you come to this approach in an other way?

---
Gertjan

2013-04-15 15:59:52

by Gertjan van Wingerde

[permalink] [raw]
Subject: Re: Re: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards

On Mon, Apr 15, 2013 at 10:18 AM, Alex Mihaylov <[email protected]> wrote:
>
> Good day!
>
>> > From: "Alex A. Mihaylov" <[email protected]>
>> > Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
>> > value in them EEPROM/EFUSE. In this case, we must use default value,
>> > but always used EEPROM/EFUSE value. As result we have tranmitt power
>> > range from -10dBm to +6dBm instead 0dBm to +16dBm.
>
>
>> > Signed-off-by: Alex A. Mihaylov <[email protected]>
>> > diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c
>> > b/drivers/net/wireless/rt2x00/rt2800lib.c
>
>
>> Could you explain how you have come to this patch?
>> Is this behavior of the Ralink provided driver that you replicated
>> here, or have you come to this approach in an other way?
>
>
> Yes, vendor driver have this code in chips/rt3070.c (function
> NICInitRT3070RFRegisters) and chips/rt30xx.c (function
> RT30xxLoadRFNormalModeSetup) files.
> Look like this:
> [skipped]
> if (pAd->TxMixerGain24G >= 2)
> {
> RFValue &= (~0x7); /* clean bit [2:0]*/
> RFValue |= pAd->TxMixerGain24G;
> }
> RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
> [skipped]
> and have differents only in constants (2 in rt30xx.c and one in tr3070.c).
> TxPower i messaurment on power detector, connected directly to module.

OK. Thanks for the explanation. I've found it myself there as well.
I'll ack the patch.

--
---
Gertjan

2013-04-16 10:28:22

by Stanislaw Gruszka

[permalink] [raw]
Subject: Re: [PATCH v2] rt2x00: Fix transmit power troubles on some Ralink RT30xx cards

On Mon, Apr 15, 2013 at 07:29:35AM +0400, [email protected] wrote:
> From: "Alex A. Mihaylov" <[email protected]>
>
> Some cards on Ralink RT30xx chipset not have correctly TX_MIXER_GAIN
> value in them EEPROM/EFUSE. In this case, we must use default value,
> but always used EEPROM/EFUSE value. As result we have tranmitt power
> range from -10dBm to +6dBm instead 0dBm to +16dBm.
>
> Correctly value in EEPROM/EFUSE is one or more for RT3070 and two or
> more for other RT30xx chips.
>
> Tested on Canyon CNP-WF518N1 usb Wi-Fi dongle and Jorjin WN8020 usb
> embedded Wi-Fi module.
>
> Signed-off-by: Alex A. Mihaylov <[email protected]>
> Cc: [email protected]

Acked-by: Stanislaw Gruszka <[email protected]>