mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 06:25:52 +02:00
net: wireless: bcmdhd: Use CONFIG_DHD_USE_STATIC_BUF for preallocated memory
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
This commit is contained in:
parent
35047200c4
commit
8d71d882e7
|
|
@ -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
|
||||
|
|
@ -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"));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
void *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);
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -675,20 +675,21 @@ void wl_android_wifictrl_func_del(void)
|
|||
}
|
||||
}
|
||||
|
||||
void* wl_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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user