From 4d7c6cbda8f292beb38cbf6bd0abbd05555e3e90 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Thu, 13 May 2010 18:25:20 -0700 Subject: wl1271: Fix recovery mechanism and buffer allocation Change-Id: I342dbeaeff034403d7f23398411a84996ca3eb08 Signed-off-by: Dmitry Shmidt --- wl1271/platforms/hw/linux/SdioAdapter.c | 4 ++-- wl1271/platforms/os/linux/inc/tracebuf.h | 2 +- wl1271/platforms/os/linux/inc/wbuf.h | 12 +++++++++--- wl1271/platforms/os/linux/src/RxBuf.c | 3 ++- wl1271/platforms/os/linux/src/osmemapi.c | 14 +++++--------- 5 files changed, 19 insertions(+), 16 deletions(-) (limited to 'wl1271/platforms') diff --git a/wl1271/platforms/hw/linux/SdioAdapter.c b/wl1271/platforms/hw/linux/SdioAdapter.c index 6abed57..aa223ba 100644 --- a/wl1271/platforms/hw/linux/SdioAdapter.c +++ b/wl1271/platforms/hw/linux/SdioAdapter.c @@ -148,7 +148,7 @@ int sdioAdapt_ConnectBus (void * fCbFunc, } /* Provide the DMA buffer address to the upper layer so it will use it as the transactions host buffer. */ if (pTxDmaSrcAddr) { /* Dm: check what to do with it */ - *pTxDmaSrcAddr = kmalloc(TIWLAN_MMC_MAX_DMA, GFP_ATOMIC | GFP_DMA); + *pTxDmaSrcAddr = kmalloc(TIWLAN_MMC_MAX_DMA, GFP_KERNEL | GFP_DMA); } return 0; } @@ -309,7 +309,7 @@ int sdioAdapt_ConnectBus (void * fCbFunc, /* Allocate a DMA-able buffer and provide it to the upper layer to be used for all read and write transactions */ if (pDmaBufAddr == 0) /* allocate only once (in case this function is called multiple times) */ { - pDmaBufAddr = kmalloc (MAX_BUS_TXN_SIZE, GFP_ATOMIC | GFP_DMA); + pDmaBufAddr = kmalloc(MAX_BUS_TXN_SIZE, GFP_KERNEL | GFP_DMA); if (pDmaBufAddr == 0) { iStatus = -1; diff --git a/wl1271/platforms/os/linux/inc/tracebuf.h b/wl1271/platforms/os/linux/inc/tracebuf.h index 249b785..441ef1e 100644 --- a/wl1271/platforms/os/linux/inc/tracebuf.h +++ b/wl1271/platforms/os/linux/inc/tracebuf.h @@ -40,7 +40,7 @@ #define TB_TRACE_H -#define TB_MALLOC(size) kmalloc(size, GFP_ATOMIC); +#define TB_MALLOC(size) kmalloc(size, GFP_KERNEL); #define TB_FREE kfree #define TB_PRINTF printk #define TB_ID current->pid diff --git a/wl1271/platforms/os/linux/inc/wbuf.h b/wl1271/platforms/os/linux/inc/wbuf.h index 1dbeb1d..4894cd6 100644 --- a/wl1271/platforms/os/linux/inc/wbuf.h +++ b/wl1271/platforms/os/linux/inc/wbuf.h @@ -108,9 +108,15 @@ typedef struct */ static inline WBUF *WbufAlloc (TI_HANDLE hOs, TI_UINT32 len) { - WBUF *pWbuf = alloc_skb (len + WSPI_PAD_BYTES, GFP_ATOMIC); - WBUF_DATA (pWbuf) += WSPI_PAD_BYTES; - return pWbuf; + gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; + WBUF *pWbuf = alloc_skb(len + WSPI_PAD_BYTES, flags); + + if (!pWbuf) + { + return NULL; + } + WBUF_DATA (pWbuf) += WSPI_PAD_BYTES; + return pWbuf; } #define WbufFree(hOs, pWbuf) ( dev_kfree_skb((struct sk_buff *)pWbuf) ) diff --git a/wl1271/platforms/os/linux/src/RxBuf.c b/wl1271/platforms/os/linux/src/RxBuf.c index 4a18acf..bda7c10 100644 --- a/wl1271/platforms/os/linux/src/RxBuf.c +++ b/wl1271/platforms/os/linux/src/RxBuf.c @@ -51,8 +51,9 @@ void *RxBufAlloc(TI_HANDLE hOs, TI_UINT32 len,PacketClassTag_e ePacketClassTag) TI_UINT32 alloc_len = len + WSPI_PAD_BYTES + PAYLOAD_ALIGN_PAD_BYTES + RX_HEAD_LEN_ALIGNED; struct sk_buff *skb; rx_head_t *rx_head; + gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - skb = alloc_skb(alloc_len, GFP_ATOMIC); + skb = alloc_skb(alloc_len, flags); if (!skb) { return NULL; diff --git a/wl1271/platforms/os/linux/src/osmemapi.c b/wl1271/platforms/os/linux/src/osmemapi.c index 85a7753..e71d303 100644 --- a/wl1271/platforms/os/linux/src/osmemapi.c +++ b/wl1271/platforms/os/linux/src/osmemapi.c @@ -99,6 +99,7 @@ os_memoryAlloc( { struct os_mem_block *blk; __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); + gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; #ifdef TI_MEM_ALLOC_TRACE os_printf("MTT:%s:%d ::os_memoryAlloc(0x%p, %lu) : %lu\n",__FUNCTION__, __LINE__,OsContext,Size,total_size); @@ -115,14 +116,7 @@ os_memoryAlloc( if (total_size < 2 * 4096) #endif { - if (in_atomic()) - { - blk = kmalloc(total_size, GFP_ATOMIC); - } - else - { - blk = kmalloc(total_size, GFP_KERNEL); - } + blk = kmalloc(total_size, flags); if (!blk) { printk("%s: NULL\n",__func__); @@ -303,13 +297,15 @@ os_memoryAlloc4HwDma( { struct os_mem_block *blk; __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); + gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; + /* if the size is greater than 2 pages then we cant allocate the memory through kmalloc so the function fails */ if (Size < 2 * OS_PAGE_SIZE) { - blk = kmalloc(total_size, GFP_ATOMIC|GFP_DMA); + blk = kmalloc(total_size, flags | GFP_DMA); if (!blk) { printk("%s: NULL\n",__func__); return NULL; -- cgit v1.2.3