OSDN Git Service

net: wireless: bcmdhd: Use CONFIG_DHD_USE_STATIC_BUF for preallocated memory
authorDmitry Shmidt <dimitrysh@google.com>
Sat, 12 Nov 2011 00:04:12 +0000 (16:04 -0800)
committerDmitry Shmidt <dimitrysh@google.com>
Mon, 19 Dec 2011 21:22:43 +0000 (13:22 -0800)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcmdhd/Kconfig
drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c
drivers/net/wireless/bcmdhd/dhd.h
drivers/net/wireless/bcmdhd/dhd_cdc.c
drivers/net/wireless/bcmdhd/dhd_linux.c
drivers/net/wireless/bcmdhd/dhd_sdio.c
drivers/net/wireless/bcmdhd/include/linux_osl.h
drivers/net/wireless/bcmdhd/linux_osl.c
drivers/net/wireless/bcmdhd/wl_android.c

index db434ab..205c813 100644 (file)
@@ -31,3 +31,10 @@ config BCMDHD_WEXT
        select WEXT_PRIV
        help
          Enables WEXT support
+
+config DHD_USE_STATIC_BUF
+       bool "Enable memory preallocation"
+       depends on BCMDHD
+       default n
+       ---help---
+         Use memory preallocated in platform
\ No newline at end of file
index 70bacbd..aedb508 100644 (file)
@@ -1002,11 +1002,11 @@ sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, u
        if (pkt == NULL) {
                sd_data(("%s: Creating new %s Packet, len=%d\n",
                         __FUNCTION__, write ? "TX" : "RX", buflen_u));
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
                if (!(mypkt = PKTGET_STATIC(sd->osh, buflen_u, write ? TRUE : FALSE))) {
 #else
                if (!(mypkt = PKTGET(sd->osh, buflen_u, write ? TRUE : FALSE))) {
-#endif /* DHD_USE_STATIC_BUF */
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
                        sd_err(("%s: PKTGET failed: len %d\n",
                                   __FUNCTION__, buflen_u));
                        return SDIOH_API_RC_FAIL;
@@ -1023,11 +1023,11 @@ sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, u
                if (!write) {
                        bcopy(PKTDATA(sd->osh, mypkt), buffer, buflen_u);
                }
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
                PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE);
 #else
                PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE);
-#endif /* DHD_USE_STATIC_BUF */
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
        } else if (((uint32)(PKTDATA(sd->osh, pkt)) & DMA_ALIGN_MASK) != 0) {
                /* Case 2: We have a packet, but it is unaligned. */
 
@@ -1036,11 +1036,11 @@ sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, u
 
                sd_data(("%s: Creating aligned %s Packet, len=%d\n",
                         __FUNCTION__, write ? "TX" : "RX", PKTLEN(sd->osh, pkt)));
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
                if (!(mypkt = PKTGET_STATIC(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) {
 #else
                if (!(mypkt = PKTGET(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) {
-#endif /* DHD_USE_STATIC_BUF */
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
                        sd_err(("%s: PKTGET failed: len %d\n",
                                   __FUNCTION__, PKTLEN(sd->osh, pkt)));
                        return SDIOH_API_RC_FAIL;
@@ -1061,11 +1061,11 @@ sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, u
                              PKTDATA(sd->osh, pkt),
                              PKTLEN(sd->osh, mypkt));
                }
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
                PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE);
 #else
                PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE);
-#endif /* DHD_USE_STATIC_BUF */
+#endif /* CONFIG_DHD_USE_STATIC_BUF */
        } else { /* case 3: We have a packet and it is aligned. */
                sd_data(("%s: Aligned %s Packet, direct DMA\n",
                         __FUNCTION__, write ? "Tx" : "Rx"));
index c87f6cf..bbb5388 100644 (file)
@@ -116,7 +116,7 @@ typedef enum  {
 } dhd_if_state_t;
 
 
-#if defined(DHD_USE_STATIC_BUF)
+#if defined(CONFIG_DHD_USE_STATIC_BUF)
 
 uint8* dhd_os_prealloc(void *osh, int section, uint size);
 void dhd_os_prefree(void *osh, void *addr, uint size);
@@ -128,7 +128,7 @@ void dhd_os_prefree(void *osh, void *addr, uint size);
 #define DHD_OS_PREALLOC(osh, section, size) MALLOC(osh, size)
 #define DHD_OS_PREFREE(osh, addr, size) MFREE(osh, addr, size)
 
-#endif /* defined(DHD_USE_STATIC_BUF) */
+#endif /* defined(CONFIG_DHD_USE_STATIC_BUF) */
 
 /* Packet alignment for most efficient SDIO (can change based on platform) */
 #ifndef DHD_SDALIGN
index 3a4de96..8460992 100644 (file)
@@ -2460,7 +2460,7 @@ dhd_prot_attach(dhd_pub_t *dhd)
        return 0;
 
 fail:
-#ifndef DHD_USE_STATIC_BUF
+#ifndef CONFIG_DHD_USE_STATIC_BUF
        if (cdc != NULL)
                MFREE(dhd->osh, cdc, sizeof(dhd_prot_t));
 #endif
@@ -2474,7 +2474,7 @@ dhd_prot_detach(dhd_pub_t *dhd)
 #ifdef PROP_TXSTATUS
        dhd_wlfc_deinit(dhd);
 #endif
-#ifndef DHD_USE_STATIC_BUF
+#ifndef CONFIG_DHD_USE_STATIC_BUF
        MFREE(dhd->osh, dhd->prot, sizeof(dhd_prot_t));
 #endif
        dhd->prot = NULL;
index 92cdc9b..32238ee 100644 (file)
@@ -3915,7 +3915,7 @@ dhd_os_sdtxunlock(dhd_pub_t *pub)
        dhd_os_sdunlock(pub);
 }
 
-#if defined(DHD_USE_STATIC_BUF)
+#if defined(CONFIG_DHD_USE_STATIC_BUF)
 uint8* dhd_os_prealloc(void *osh, int section, uint size)
 {
        return (uint8*)wl_android_prealloc(section, size);
@@ -3924,7 +3924,7 @@ uint8* dhd_os_prealloc(void *osh, int section, uint size)
 void dhd_os_prefree(void *osh, void *addr, uint size)
 {
 }
-#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */
+#endif /* defined(CONFIG_DHD_USE_STATIC_BUF) */
 
 #if defined(CONFIG_WIRELESS_EXT)
 struct iw_statistics *
index 2930115..760e2be 100644 (file)
@@ -5736,7 +5736,7 @@ dhdsdio_release_malloc(dhd_bus_t *bus, osl_t *osh)
                return;
 
        if (bus->rxbuf) {
-#ifndef DHD_USE_STATIC_BUF
+#ifndef CONFIG_DHD_USE_STATIC_BUF
                MFREE(osh, bus->rxbuf, bus->rxblen);
 #endif
                bus->rxctl = bus->rxbuf = NULL;
@@ -5744,7 +5744,7 @@ dhdsdio_release_malloc(dhd_bus_t *bus, osl_t *osh)
        }
 
        if (bus->databuf) {
-#ifndef DHD_USE_STATIC_BUF
+#ifndef CONFIG_DHD_USE_STATIC_BUF
                MFREE(osh, bus->databuf, MAX_DATA_BUF);
 #endif
                bus->databuf = NULL;
index 1ec136e..38de298 100644 (file)
@@ -268,7 +268,7 @@ extern int osl_error(int bcmerror);
 #define PKTLIST_DUMP(osh, buf)
 #define PKTDBG_TRACE(osh, pkt, bit)
 #define        PKTFREE(osh, skb, send)         osl_pktfree((osh), (skb), (send))
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
 #define        PKTGET_STATIC(osh, len, send)           osl_pktget_static((osh), (len))
 #define        PKTFREE_STATIC(osh, skb, send)          osl_pktfree_static((osh), (skb), (send))
 #endif
index 1a54437..b3fcdd2 100644 (file)
@@ -47,7 +47,7 @@
 #define OS_HANDLE_MAGIC                0x1234abcd      
 #define BCM_MEM_FILENAME_LEN   24              
 
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
 #define STATIC_BUF_MAX_NUM     16
 #define STATIC_BUF_SIZE                (PAGE_SIZE * 2)
 #define STATIC_BUF_TOTAL_LEN   (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE)
@@ -70,7 +70,7 @@ typedef struct bcm_static_pkt {
 } bcm_static_pkt_t;
 
 static bcm_static_pkt_t *bcm_static_skb = 0;
-#endif 
+#endif
 
 typedef struct bcm_mem_link {
        struct bcm_mem_link *prev;
@@ -211,7 +211,7 @@ osl_attach(void *pdev, uint bustype, bool pkttag)
                        break;
        }
 
-#if defined(DHD_USE_STATIC_BUF)
+#if defined(CONFIG_DHD_USE_STATIC_BUF)
        if (!bcm_static_buf) {
                if (!(bcm_static_buf = (bcm_static_buf_t *)dhd_os_prealloc(osh, 3, STATIC_BUF_SIZE+
                        STATIC_BUF_TOTAL_LEN))) {
@@ -220,25 +220,25 @@ osl_attach(void *pdev, uint bustype, bool pkttag)
                else
                        printk("alloc static buf at %x!\n", (unsigned int)bcm_static_buf);
 
-
                sema_init(&bcm_static_buf->static_sem, 1);
 
                bcm_static_buf->buf_ptr = (unsigned char *)bcm_static_buf + STATIC_BUF_SIZE;
        }
 
        if (!bcm_static_skb) {
-               int i;
-               void *skb_buff_ptr = 0;
-               bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048);
-               skb_buff_ptr = dhd_os_prealloc(osh, 4, 0);
-
-               bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *) * 16);
-               for (i = 0; i < STATIC_PKT_MAX_NUM * 2; i++)
-                       bcm_static_skb->pkt_use[i] = 0;
-
-               sema_init(&bcm_static_skb->osl_pkt_sem, 1);
+               void *skb_buff_ptr = dhd_os_prealloc(osh, 4, 0);
+
+               if (skb_buff_ptr) {
+                       bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048);
+                       bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *) * 16);
+                       for (i = 0; i < STATIC_PKT_MAX_NUM * 2; i++)
+                               bcm_static_skb->pkt_use[i] = 0;
+                       sema_init(&bcm_static_skb->osl_pkt_sem, 1);
+               } else {
+                       printk("can not alloc static skb buffers\n");
+               }
        }
-#endif 
+#endif
 
        return osh;
 }
@@ -388,7 +388,7 @@ osl_ctfpool_stats(osl_t *osh, void *b)
        if ((osh == NULL) || (osh->ctfpool == NULL))
                return;
 
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
        if (bcm_static_buf) {
                bcm_static_buf = 0;
        }
@@ -548,14 +548,14 @@ osl_pktfree(osl_t *osh, void *p, bool send)
        }
 }
 
-#ifdef DHD_USE_STATIC_BUF
+#ifdef CONFIG_DHD_USE_STATIC_BUF
 void *
 osl_pktget_static(osl_t *osh, uint len)
 {
        int i;
        struct sk_buff *skb;
 
-       if (len > (PAGE_SIZE * 2)) {
+       if (!bcm_static_skb || (len > (PAGE_SIZE * 2))) {
                printk("%s: attempt to allocate huge packet (0x%x)\n", __FUNCTION__, len);
                return osl_pktget(osh, len);
        }
@@ -570,10 +570,10 @@ osl_pktget_static(osl_t *osh, uint len)
 
                if (i != STATIC_PKT_MAX_NUM) {
                        bcm_static_skb->pkt_use[i] = 1;
-                       up(&bcm_static_skb->osl_pkt_sem);
                        skb = bcm_static_skb->skb_4k[i];
                        skb->tail = skb->data + len;
                        skb->len = len;
+                       up(&bcm_static_skb->osl_pkt_sem);
                        return skb;
                }
        }
@@ -586,10 +586,10 @@ osl_pktget_static(osl_t *osh, uint len)
 
        if (i != STATIC_PKT_MAX_NUM) {
                bcm_static_skb->pkt_use[i+STATIC_PKT_MAX_NUM] = 1;
-               up(&bcm_static_skb->osl_pkt_sem);
                skb = bcm_static_skb->skb_8k[i];
                skb->tail = skb->data + len;
                skb->len = len;
+               up(&bcm_static_skb->osl_pkt_sem);
                return skb;
        }
 
@@ -603,9 +603,14 @@ osl_pktfree_static(osl_t *osh, void *p, bool send)
 {
        int i;
 
+       if (!bcm_static_skb) {
+               osl_pktfree(osh, p, send);
+               return;
+       }
+
+       down(&bcm_static_skb->osl_pkt_sem);
        for (i = 0; i < STATIC_PKT_MAX_NUM; i++) {
                if (p == bcm_static_skb->skb_4k[i]) {
-                       down(&bcm_static_skb->osl_pkt_sem);
                        bcm_static_skb->pkt_use[i] = 0;
                        up(&bcm_static_skb->osl_pkt_sem);
                        return;
@@ -614,14 +619,15 @@ osl_pktfree_static(osl_t *osh, void *p, bool send)
 
        for (i = 0; i < STATIC_PKT_MAX_NUM; i++) {
                if (p == bcm_static_skb->skb_8k[i]) {
-                       down(&bcm_static_skb->osl_pkt_sem);
                        bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 0;
                        up(&bcm_static_skb->osl_pkt_sem);
                        return;
                }
        }
+       up(&bcm_static_skb->osl_pkt_sem);
 
-       return osl_pktfree(osh, p, send);
+       osl_pktfree(osh, p, send);
+       return;
 }
 #endif 
 
index 9ca3d60..67f7d9f 100644 (file)
@@ -675,20 +675,21 @@ void wl_android_wifictrl_func_del(void)
        }
 }
 
-voidwl_android_prealloc(int section, unsigned long size)
+void *wl_android_prealloc(int section, unsigned long size)
 {
        void *alloc_ptr = NULL;
        if (wifi_control_data && wifi_control_data->mem_prealloc) {
                alloc_ptr = wifi_control_data->mem_prealloc(section, size);
                if (alloc_ptr) {
                        DHD_INFO(("success alloc section %d\n", section));
-                       bzero(alloc_ptr, size);
+                       if (size != 0L)
+                               bzero(alloc_ptr, size);
                        return alloc_ptr;
                }
        }
 
        DHD_ERROR(("can't alloc section %d\n", section));
-       return 0;
+       return NULL;
 }
 
 int wifi_get_irq_number(unsigned long *irq_flags_ptr)