SDIO WiFi

155 views
Skip to first unread message

clau...@gmail.com

unread,
Oct 9, 2008, 2:46:29 AM10/9/08
to Beagle Board, clau...@yahoo.com.tw
Hi everyone ,

I had porting the Libertas driver (http://linuxwireless.org/en/users/
Drivers/libertas) at kernel 2.6.26 with muru path. I verify the driver
the SDIO marvell 88W8686 module.
The driver work now , but the performance is bad. The ping time near
20 ms and the ftp below 70KB/s.
The TI SDIO host driver implementation (omap_hsmmc.c) of linux kernel
don't support SDIO card interrupt cause the result. The default linux
SDIO stack use polling to make the SDIO workable even the host don't
support SDIO.

Do anyone or anywhere could get the example code to disable/enable the
SDIO card interrupt at OMAP 3430/3530 ?

Thanks for your advise.

Claud Yu

Alecrim

unread,
Oct 15, 2008, 7:47:30 PM10/15/08
to Beagle Board
Hi Claud,

I'll check the status of SDIO with Beagleboard ASAP.

Regards,
Alecrim.

claud yu

unread,
Oct 15, 2008, 9:33:58 PM10/15/08
to beagl...@googlegroups.com
Hi Alecrim ,

Following is experience of SDIO I know. The office SDIO stack appear at 2.6.24 and the libertas driver used.

The SD/SDIO host driver (ex. omap_hsmmc.c or pxamci.c) need to declare the host has SDIO capacity and add enable/disable SDIO card interrupt function.
And the host driver need to take care the SDIO interrupt in Interrupt handler.

Basically the office SDIO stack using polling that make the non-SDIO host work with SDIO peripheral. But the performance always bad but work.


------------------------------------------------

 mmc->caps |=  MMC_CAP_SDIO_IRQ; //  declare SDIO capacity

------------------------------------------------
#define CIRQ_ENABLE (1<<8) // The enable/disable SDIO irq function for SDIO stack
static void omap_hsmmc_enable_sdio_irq(struct mmc_host *host, int enable)
{
       struct mmc_omap_host *host = mmc_priv(host);
       unsigned long flags;
       u32 reg;

       reg = INT_EN_MASK;
       reg &= ~CIRQ_ENABLE;

       if (enable)
               reg |= CIRQ_ENABLE;

       OMAP_HSMMC_WRITE(host->base, ISE, reg);
       OMAP_HSMMC_WRITE(host->base, IE, reg);

   mmiowb();
}


static struct mmc_host_ops mmc_omap_ops = {
        .request = omap_mmc_request,
        .set_ios = omap_mmc_set_ios,
        .enable_sdio_irq        = omap_hsmmc_enable_sdio_irq,
};
------------------------------------------------
static irqreturn_t mmc_omap_irq(int irq, void *dev_id) // the modified part of irq handler
{
 ......
     if (status & (CIRQ_ENABLE)) {
               printk("MMC: Card Interrupt.\n");
               mmc_signal_sdio_irq(host->mmc);
       }

         return IRQ_HANDLED;

}


------------------------------------------------

Claud Yu

2008/10/16 Alecrim <ale...@gmail.com>

pasenth

unread,
Dec 3, 2008, 9:18:02 AM12/3/08
to Beagle Board
Hi,
is this code tested? I did the same thing, but I saw that, even
if there are NO interrupts from the card, IRQ line is asserted and
there is a never-ending stream of interrupts. [I even forced to reset
all the interrupts from card in the init as well] I was trying to
optimize the mmc polling implementation [in 2.6.28 git linux kernel]
to interrupt based implementation. any other registers to read/write?
Also I believe the level is mentioned as active low in both SDIO
spec and Ti 3530 TRM SDIO. Any issues with that? may be I've to check
with a bus analyzer.

Thanks
p
Reply all
Reply to author
Forward
0 new messages