Search Linux Wireless

Re: USB rt2x00 driver regression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sergei,

<...>

>>>>> It worked well with older kernels and does not with newer kernels.
>>>>> Specifically it fails to find any AP when scanning.
>>>>> The first bad commit is:
>>>>>
>>>>> commit 76773f301f2210dcc20c466aebda7118062673eb
>>>>> Author: Gabor Juhos <juhosg@xxxxxxxxxxx>
>>>>> Date:   Sat Aug 17 14:09:30 2013 +0200
>>>>>
>>>>>   rt2x00: rt2800lib: use a MCU command for frequency adjustment on USB devices
>>>>>
>>>>>   According to the Ralink driver, there is an MCU
>>>>>   command which can be used to send the frequency
>>>>>   offset value directly to the USB device without
>>>>>   going through the RFCSR writing sequence.
>>>>>
>>>>>   Based on the DPO_RT5572_LinuxSTA_2.6.0.1_20120629
>>>>>   driver.
>>>>>
>>>>>   Reference:
>>>>>     RTMPAdjustFrequencyOffset function in common/rt_rf.c
>>>>>
>>>>>   Signed-off-by: Gabor Juhos <juhosg@xxxxxxxxxxx>
>>>>>   Signed-off-by: John W. Linville <linville@xxxxxxxxxxxxx>
>>>>>
>>>>> After I removed this special USB handling (see the patch) the adapter
>>>>> works again.
>>>>
>>>> Thanks for bisecting! Could you check if following patch fixes the
>>>> issue?
>>>
>>> It does not fix the issue. The same broken behavior remains.
>> I couldn't understand one string in original RTMPAdjustFrequencyOffset. Could you try follow patch ?
> Tried your patch with and without Stanislaw's patch. No success.

I guess that this is a timing issue. Maybe the RT5390 device does not finish the
MCU command before the scan runs.

The Ralink reference driver calls the frequency adjustment code from the
NICInitRT5390RFRegisters function but the equivalent call is missing from the
rt2x00 driver. Additionaly, the Ralink driver uses 1 ms delay after calling the
frequency adjustment code which is also missing from rt2x00.

The attached patch set adds the missing code to rt2x00. Please test whether it
fixes the problem or not.

Thanks,
Gabor


>From ff8f124dcc6b256c63a006c9fde9e02785fa20b6 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@xxxxxxxxxxx>
Date: Sun, 19 Jan 2014 12:54:49 +0100
Subject: [PATCH 1/2] rt2x00: rt2800lib: add a delay after frequency
 adjustment MCU command

The delay helps to ensure that the MCU command is processed
by the USB device before we are returning from the frequency
adjustment code.

Signed-off-by: Gabor Juhos <juhosg@xxxxxxxxxxx>
---
 drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index d152b16..c6bc231 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1980,6 +1980,7 @@ static void rt2800_adjust_freq_offset(struct rt2x00_dev *rt2x00dev)
 	if (rt2x00_is_usb(rt2x00dev)) {
 		rt2800_mcu_request(rt2x00dev, MCU_FREQ_OFFSET, 0xff,
 				   freq_offset, prev_rfcsr);
+		usleep_range(1000, 1500);
 		return;
 	}
 
-- 
1.7.10

>From 3f4a100688acbe0c331fc490827bb21c2dc614ca Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@xxxxxxxxxxx>
Date: Fri, 17 Jan 2014 22:08:51 +0100
Subject: [PATCH 2/2] rt2x00: rt2800lib: adjust frequency offset during rfcsr
 init on RT5390/5392

Signed-off-by: Gabor Juhos <juhosg@xxxxxxxxxxx>
---
 drivers/net/wireless/rt2x00/rt2800lib.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index c6bc231..ca92403 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -6550,6 +6550,8 @@ static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
 {
 	rt2800_rf_init_calibration(rt2x00dev, 2);
 
+	rt2800_adjust_freq_offset(rt2x00dev);
+
 	rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
 	rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
 	rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
@@ -6648,6 +6650,8 @@ static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev)
 {
 	rt2800_rf_init_calibration(rt2x00dev, 2);
 
+	rt2800_adjust_freq_offset(rt2x00dev);
+
 	rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
 	rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
 	rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
-- 
1.7.10


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux