Libertas SDIO on TC7901 Arm

Tom Maughan tom at tmaughan.co.uk
Wed Feb 24 13:09:17 EST 2010


I'm trying to get Linux running on a cheap Chinese internet 
tablet.   Its based on the Telechips 7901 arm device and has a 
WM-G-MR-09 SD8686 based WiFi module on board.

Searching this list has been very helpful as initially I couldn't 
even load the firmware.   The hotplug script and adding msleep(1) 
into the firmware loading loop helped.

firstly I'm stuck using kernel 2.6.24.2.   The BSP for the chip is 
built around that kernel and the supplied patch files are a mess.

The kernel can see the SDIO card:
 > mmc1: new SDIO card at address 0001

It is reporting a 4bit interface to the SD8686.

The helper firmware loads and boots:
 > libertas enter: if_sdio_init_module():1064
 > libertas_sdio: Libertas SDIO driver
 > libertas_sdio: Copyright Pierre Ossman
 > libertas enter: if_sdio_probe():870
 > libertas thread: class = 0x7, vendor = 0x2DF, device = 0x9103, 
model = 0xB, ioport = 0x10000
 > libertas enter: if_sdio_prog_firmware():665
 > libertas enter: if_sdio_prog_helper():417
 > libertas thread: sending 60 bytes chunk

It repeats the sending 60 byte chunk

 > libertas thread: waiting for helper to boot...
 > libertas leave: if_sdio_prog_helper():518, ret 0

It then loads the main firmware:
 > libertas enter: if_sdio_prog_real():534
 > libertas thread: firmware wants 16 bytes
 > libertas thread: sending 16 bytes (32 bytes) chunk
 > libertas thread: firmware wants 512 bytes
 > libertas thread: sending 512 bytes (512 bytes) chunk

It repeats the 'wants 16 bytes' and 'wants 512 bytes' for a few pages.

 > libertas thread: firmware wants 16 bytes
 > libertas thread: sending 16 bytes (32 bytes) chunk
 > libertas thread: firmware wants 176 bytes
 > libertas thread: sending 176 bytes (192 bytes) chunk
 > libertas thread: firmware wants 16 bytes
 > libertas thread: sending 16 bytes (32 bytes) chunk
 > libertas thread: waiting for firmware to boot...
 > libertas: failed to load firmware
 > libertas leave: if_sdio_prog_real():655, ret -110
 > libertas leave: if_sdio_prog_firmware():691, ret -110
 > libertas leave: if_sdio_probe():988, ret -110
 > libertas_sdio: probe of mmc1:0001:1 failed with error -110
 > libertas leave: if_sdio_init_module():1071, ret 0

-110 is ETIMEDOUT on this system.   The scratch register always reads 
back as zero.

I've tried the V8 and V9 from the linux-firmware repository and 
current firmware from Marvel's website (9.70.3.p24).

I know the hardware can work as the supplied OS, WinCE5, gets a 
wireless connection.   The WinCE setup is using firmware 9.70.3.32.

I've turned on MMC debug and I get:

 > libertas thread: firmware wants 16 bytes
 > libertas thread: sending 16 bytes (32 bytes) chunk
 > tcc_mmc_start_command: opcode=53, arg=92000020
 > tcc_mmc_finish_command: R1: resp[0]=0x00002000
 > tcc_mmc_start_command: opcode=52, arg=10004000
 > tcc_mmc_finish_command: R1: resp[0]=0x0000100d
 > tcc_mmc_start_command: opcode=52, arg=10002000
 > tcc_mmc_finish_command: R1: resp[0]=0x000010b0
 > tcc_mmc_start_command: opcode=52, arg=10002200
 > tcc_mmc_finish_command: R1: resp[0]=0x00001000

It appears the MMC interface is working.   It works fine with an SD 
Flash card in the second slot.

So I seem to be down to the options of:
The libertas driver doesn't work in 2.6.24.2, but I can't find 
anything to indicate that this is the case.
Or
There is something wrong with how the MMC port is setup or the driver 
supplied with the BSP.

I'm currently going for the latter but so far my only experience with 
SD cards has been over SPI to an Atmel.

Any hints, tips and help is much appreciated.

Thanks for reading!


--
Tom 




More information about the libertas-dev mailing list