diff options
author | San Mehat <> | 2009-03-24 21:26:31 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-24 21:26:31 -0700 |
commit | 30c7578b5310e2dea8ec949ed294fff998ad3401 (patch) | |
tree | 30a50688290929042402582683f6ada42ac8cf54 /sta_dk_4_0_4_32/pform/linux | |
parent | 28334f5ebb2cb84d2901109f1559a6d12f0cb4ab (diff) | |
download | ti-30c7578b5310e2dea8ec949ed294fff998ad3401.tar.gz |
Automated import from //branches/donutburger/...@142092,142092
Diffstat (limited to 'sta_dk_4_0_4_32/pform/linux')
-rwxr-xr-x | sta_dk_4_0_4_32/pform/linux/src/tnetw_sdio.c | 187 |
1 files changed, 54 insertions, 133 deletions
diff --git a/sta_dk_4_0_4_32/pform/linux/src/tnetw_sdio.c b/sta_dk_4_0_4_32/pform/linux/src/tnetw_sdio.c index bc88b9c..a6bb7ba 100755 --- a/sta_dk_4_0_4_32/pform/linux/src/tnetw_sdio.c +++ b/sta_dk_4_0_4_32/pform/linux/src/tnetw_sdio.c @@ -25,17 +25,18 @@ #include "esta_drv.h" #include "mmc_omap_api.h" #include "osApi.h" -#define DM_DMA_WORKAROUND + /*-------------------------------------------------------------------*/ extern int tiwlan_sdio_init(struct sdio_func *func); extern int sdio_reset_comm(struct mmc_card *card); + /*-------------------------------------------------------------------*/ static struct sdio_func *tiwlan_func = NULL; static int sdio_reset_flag = 0; -#ifdef DM_DMA_WORKAROUND + #define DMA_THRESHOLD_SIZE 64 static void *sdio_dma_ptr = NULL; -#endif + /*-------------------------------------------------------------------*/ void SDIO_SetFunc( struct sdio_func *func ) { @@ -44,39 +45,37 @@ void SDIO_SetFunc( struct sdio_func *func ) struct sdio_func *SDIO_GetFunc( void ) { - return( tiwlan_func ); + return tiwlan_func; } SDIO_Status SDIO_Init(SDIO_ConfigParams *ConfigParams, SDIO_Handle *Handle) { - if( Handle == NULL ) { + if (Handle == NULL) { printk(KERN_ERR "Error: SDIO_Init() called with NULL!\n"); return SDIO_FAILURE; } + *Handle = (SDIO_Handle)SDIO_GetFunc(); - if( (*Handle) == NULL ) { - printk(KERN_ERR "Error: SDIO_Init() called before SDIO probe completed!\n"); + if ((*Handle) == NULL) { + printk(KERN_ERR "SDIO_Init() called before init!\n"); return SDIO_FAILURE; } -#ifdef DM_DMA_WORKAROUND - if( !sdio_dma_ptr ) { - sdio_dma_ptr = kmalloc( PAGE_SIZE, GFP_KERNEL ); - if( !sdio_dma_ptr ) - return SDIO_FAILURE; - } -#endif + + if (!sdio_dma_ptr) { + if (!(sdio_dma_ptr = kmalloc(PAGE_SIZE, GFP_KERNEL))) { + printk(KERN_ERR "Failed to alloc DMA bounce buffer\n"); + return SDIO_FAILURE; + } + } return SDIO_SUCCESS; } SDIO_Status SDIO_Shutdown(SDIO_Handle Handle) { - /* printk("%s:\n", __FUNCTION__); */ -#ifdef DM_DMA_WORKAROUND - if( sdio_dma_ptr ) { - kfree( sdio_dma_ptr ); - sdio_dma_ptr = NULL; - } -#endif + if (sdio_dma_ptr) { + kfree(sdio_dma_ptr); + sdio_dma_ptr = NULL; + } return SDIO_SUCCESS; } @@ -84,14 +83,14 @@ SDIO_Status SDIO_Start(SDIO_Handle Handle) { struct sdio_func *func = (struct sdio_func *)Handle; - /* printk("%s:\n", __FUNCTION__); */ - if( func ) { - if( sdio_reset_flag ) { + if (func) { + if (sdio_reset_flag) { sdio_reset_flag = 0; - if( tiwlan_sdio_init(func) ) { - printk("TI: tiwlan_sdio_init Error !\n"); + if (tiwlan_sdio_init(func)) { + printk("TI: tiwlan_sdio_init Error!\n"); return SDIO_FAILURE; } + } } return SDIO_SUCCESS; @@ -101,135 +100,57 @@ SDIO_Status SDIO_Reset(SDIO_Handle Handle) { struct sdio_func *func = (struct sdio_func *)Handle; - /* printk("%s:\n", __FUNCTION__); */ - if( func && func->card ) { + if(func && func->card) sdio_reset_comm(func->card); - } return SDIO_SUCCESS; } SDIO_Status SDIO_Stop(SDIO_Handle Handle, unsigned long Wait_Window) { - /* printk("%s:\n", __FUNCTION__); */ sdio_reset_flag = 1; - return SDIO_Reset( Handle ); -} - -static int read_direct(struct sdio_func *func, unsigned char *buf, - unsigned long addr, unsigned len) -{ - unsigned i; - int rc0, rc = 0; - - for(i=0;( i < len );i++,addr++) { - *buf++ = (unsigned char)sdio_readb(func, addr, &rc0); - if( rc0 != 0 ) - rc = rc0; - } - return rc; -} - -static int write_direct(struct sdio_func *func, unsigned long addr, - unsigned char *buf, unsigned len) -{ - unsigned i; - int rc0, rc = 0; - - for(i=0;( i < len );i++,addr++) { - sdio_writeb(func, *buf++, addr, &rc0); - if( rc0 != 0 ) - rc = rc0; - } - return rc; + return SDIO_Reset(Handle); } SDIO_Status SDIO_SyncRead(SDIO_Handle Handle, SDIO_Request_t *Req) { struct sdio_func *func = (struct sdio_func *)Handle; - int rc, retries = 5; - -#if 0 - printk("%s: p_addr = 0x%.8lx, sz = %d\n", - __FUNCTION__, - Req->peripheral_addr, - Req->buffer_len); -#endif + int rc; + + if (Req->buffer_len < DMA_THRESHOLD_SIZE) { + rc = sdio_memcpy_fromio(func, Req->buffer, + Req->peripheral_addr, Req->buffer_len); + } else { + rc = sdio_memcpy_fromio(func, sdio_dma_ptr, + Req->peripheral_addr, Req->buffer_len); + memcpy(Req->buffer, sdio_dma_ptr, Req->buffer_len); + } - while(retries) { - if( retries > 2 ) -#ifdef DM_DMA_WORKAROUND - if( Req->buffer_len < DMA_THRESHOLD_SIZE ) { - rc = sdio_memcpy_fromio(func, Req->buffer, Req->peripheral_addr, Req->buffer_len); - } - else { - rc = sdio_memcpy_fromio(func, sdio_dma_ptr, Req->peripheral_addr, Req->buffer_len); - memcpy( Req->buffer, sdio_dma_ptr, Req->buffer_len ); - } -#else - rc = sdio_memcpy_fromio(func, Req->buffer, Req->peripheral_addr, Req->buffer_len); -#endif - else - rc = read_direct(func, Req->buffer, Req->peripheral_addr, Req->buffer_len); - - if (rc) { - printk(KERN_ERR "%s: Read operation failed (%d) (retries = %d)\n", - __FUNCTION__, rc, retries); - retries--; - continue; - } - if (retries != 5) - printk(KERN_ERR "%s: Retry succeeded\n", __FUNCTION__); + if (!rc) return SDIO_SUCCESS; - } - printk(KERN_ERR "%s: Giving up\n", __FUNCTION__); + + printk("SDIO Write failure (%d)\n", rc); return SDIO_FAILURE; } SDIO_Status SDIO_SyncWrite(SDIO_Handle Handle, SDIO_Request_t *Req) { struct sdio_func *func = (struct sdio_func *)Handle; - int rc, retries = 5; -#ifdef DM_DMA_WORKAROUND - void *dma_ptr; -#endif - -#if 0 - printk("%s: p_addr = 0x%.8lx, sz = %d\n", - __FUNCTION__, - Req->peripheral_addr, - Req->buffer_len); -#endif - - while(retries) { - if( retries > 2 ) { -#ifdef DM_DMA_WORKAROUND - if( Req->buffer_len < DMA_THRESHOLD_SIZE ) { - dma_ptr = Req->buffer; - } - else { - dma_ptr = sdio_dma_ptr; - memcpy( dma_ptr, Req->buffer, Req->buffer_len ); - } - rc = sdio_memcpy_toio(func, Req->peripheral_addr, dma_ptr, Req->buffer_len); -#else - rc = sdio_memcpy_toio(func, Req->peripheral_addr, Req->buffer, Req->buffer_len); -#endif - } - else - rc = write_direct(func, Req->peripheral_addr, Req->buffer, Req->buffer_len); - - if (rc) { - printk(KERN_ERR "%s: Write operation failed (%d) (retries = %d)\n", - __FUNCTION__, rc, retries); - retries--; - continue; - } + int rc; + void *dma_ptr; + + if (Req->buffer_len < DMA_THRESHOLD_SIZE) + dma_ptr = Req->buffer; + else { + dma_ptr = sdio_dma_ptr; + memcpy(dma_ptr, Req->buffer, Req->buffer_len); + } - if (retries != 5) - printk(KERN_ERR "%s: Retry succeeded\n", __FUNCTION__); + rc = sdio_memcpy_toio(func, Req->peripheral_addr, dma_ptr, + Req->buffer_len); + if (!rc) return SDIO_SUCCESS; - } - printk(KERN_ERR "%s: Giving up\n", __FUNCTION__); + + printk("SDIO Write failure (%d)\n", rc); return SDIO_FAILURE; } #endif |