Kernel freeze while firmware helper loading

Cyril HAENEL chaenel at free.fr
Fri Dec 5 03:21:58 EST 2008



Dan Williams a écrit :

>On Thu, 2008-12-04 at 12:48 -0500, Dan Williams wrote:
>  
>
>>On Thu, 2008-12-04 at 17:59 +0100, Cyril HAENEL wrote:
>>    
>>
>>>Hi all,
>>>
>>>I have a small problem and I don't know from where it can come from.
>>>I work on a AT91SAM9260 processor based custom board (arm9), with kernel 
>>>2.6.27 and associated patches.
>>>I activated the compact flash libertas driver, and the wifi board is 
>>>correctly detected at boot up.
>>>
>>>But when I try to load the firmware_helper the kernel freeze after some 
>>>calls to the ioread8() function. I put some debug messages in if_cs.c to 
>>>locate exactly the problem.
>>>
>>>Kernel messages at boot up :
>>>
>>>[...]
>>>at91_cf: irqs det #64, io #81
>>>[...]
>>>pccard: PCMCIA card inserted into slot 0
>>>pcmcia: registering new device pcmcia0.0
>>>[...]
>>>firmware: requesting libertas_cs_helper.fw
>>>[...]
>>>
>>>Atfer I try to load the firmware helper :
>>>
>>>echo 1 > /sys/class/firmware/0.0/loading
>>>cat libertas_cs_helper.fw > /sys/class/firmware/0.0/data
>>>echo 0 > /sys/class/firmware/0.0/loading
>>>
>>>And I have :
>>>
>>>cyril : firmware is in memory (2132 bytes), going to load it
>>>
>>>cyril : sending 256 byte
>>>begin write 16
>>>outw 00000018>0100
>>>end write 16
>>>begin write 16 rep
>>>outsw 0000001a>(0x80 words)
>>>end write 16 rep
>>>begin write 8
>>>outb 00000000>04
>>>end write 8
>>>begin write 16
>>>outw 00000002>0004
>>>end write 16
>>>cyril : 1 bytes sent, going to poll status register
>>>begin read 8
>>>inb 00000020<04
>>>end read 8
>>>
>>>[1, 2, 3 times, sometime more]
>>>
>>>cyril : sending 256 byte
>>>begin write 16
>>>outw 00000018>0100
>>>end write 16
>>>begin write 16 rep
>>>outsw 0000001a>(0x80 words)
>>>end write 16 rep
>>>begin write 8
>>>outb 00000000>04
>>>end write 8
>>>begin write 16
>>>outw 00000002>0004
>>>end write 16
>>>cyril : 1 bytes sent, going to poll status register
>>>begin read 8
>>>
>>>The kernel freeze here, when it call the ioread8(card->iobase + reg) 
>>>function, in if_cs_read8() function.
>>>
>>>Any idea of where can come from this freeze ?
>>>      
>>>
>>Could be the controller, the card, anything actually.  How are you
>>grabbing the debug output, via serial line or something?  Also, is it a
>>real freeze or a panic?  If you can do sysrq, maybe we can get a
>>stacktrace or something, but sysrq might well be x86 only.
>>
>>It looks like on ARM that ioread8() decomposes down to a direct memory
>>access:
>>    
>>
>
>#define __raw_readb(a)          (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a))
>
>if I traced it down correctly.  Any chance you can check the hardware
>state of the host machine and see if some exception or interrupt
>occurred?
>
>Dan
>
>
>_______________________________________________
>libertas-dev mailing list
>libertas-dev at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/libertas-dev
>
>
>  
>
Hi Dan, I have not solved the problem but I found it : it comes from the 
/wait signal of the wifi module which stay to low level after some 
ioread8(). Thus the processor wait until the signal go to level one....
I tried to remove the wifi card and the processor continues its job....
Now I must find why the /wait signal stay to 0 after some read....

Regards

-- 

Cyril Haenel
Registered Linux User #332632




More information about the libertas-dev mailing list