Thread (9 messages) 9 messages, 4 authors, 2012-08-27

Re: rt73usb not working since linux 3.4

From: Gertjan van Wingerde <hidden>
Date: 2012-08-26 18:30:08

Hi Andreas,

On 08/23/12 20:51, Andreas Messer wrote:
Hey there,

Am Dienstag, 24. Juli 2012, 19:33:34 schrieb Andreas Messer:
quoted
Hello Again,

Am Dienstag, 26. Juni 2012, 13:18:35 schrieb John W. Linville:
quoted
On Tue, Jun 26, 2012 at 06:03:56PM +0200, Andreas Messer wrote:
quoted
Dear all,

updating my pc from linux kernel 3.3 to linux kernel 3.4 broke my wlan.
I have spent some more time on investigating the cause of the bug and found 
the problem. Actually I'm not sure which is the right solution. The problem is 
caused by the following points:

1) The rt73 hardware registers are not initialized before bringing the 
   corresponding network interface up ('ifconfig wlan0 up')

2) Bringing the interface up is not possible because of the kill switch

3) The GPIO input pin for the kill switch is still in 'output mode' (the
   default power on value), therefore the register will always read 
   'killswitch on'

So something like a deadlock. While looking through the code, I have seen, 
that the whole rt2xx driver uses here the same concept, that the hardware 
register initialization and firmware-download does not happen before the
interface is brought up. Im not sure if that is the right concept, shouldn't 
be the hardware initialized properly on loading the driver already? I mean, if 
values are read from the hardware in order to e.g. read the kill switch state 
shouldn't bethe hardware in a defined state before that? Anyway, it would be 
possible to solve this bug easily by only setting up the correct value of the 
CSR13 register right after reading the eeprom. For simple testing I have 
written the correct gpio mask to CSR13 using the debugfs interface and the 
wlan interface immediately was brought up and connected successfully with my 
Network.

So which is the right solution? I could make & test a patch for the simple 
solution easily.
Thanks for you extensive analysis. You seem to be absolutely right that
we need to properly setup the GPIO direction of the rfkill switch GPIO
pin. And it seems that all rt2x00 drivers (not only rt73usb) are
suffering from this.

The reason why we do most of the initialization at interface up is that
that is the earliest possible time we can get the firmware image from
userspace. A lot of the register programming we have to do for
initialization depend on the firmware being uploaded and running, hence
we initialize most at interface up time.

However, the correct fix IMHO here is to set the GPIO direction of the
rfkill switch GPIO pin to input at driver load time.

Find attached a patch that does this for all the rt2x00 devices. I hope
you are able to test whether this patch fixes the problem for you.

Once you have verified that the patch works, I will submit the changes
as a proper patch series for inclusion upstream.

---
Gertjan

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help