diff options
Diffstat (limited to 'bcm4329/src/shared')
-rw-r--r-- | bcm4329/src/shared/aiutils.c | 21 | ||||
-rw-r--r-- | bcm4329/src/shared/bcmutils.c | 20 | ||||
-rw-r--r-- | bcm4329/src/shared/bcmwifi.c | 4 | ||||
-rw-r--r-- | bcm4329/src/shared/hndpmu.c | 4 | ||||
-rw-r--r-- | bcm4329/src/shared/linux_osl.c | 206 | ||||
-rw-r--r-- | bcm4329/src/shared/miniopt.c | 4 | ||||
-rw-r--r-- | bcm4329/src/shared/sbutils.c | 5 | ||||
-rw-r--r-- | bcm4329/src/shared/siutils.c | 21 | ||||
-rw-r--r-- | bcm4329/src/shared/siutils_priv.h | 3 |
9 files changed, 261 insertions, 27 deletions
diff --git a/bcm4329/src/shared/aiutils.c b/bcm4329/src/shared/aiutils.c index 00e96a8..1962711 100644 --- a/bcm4329/src/shared/aiutils.c +++ b/bcm4329/src/shared/aiutils.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: aiutils.c,v 1.6.4.7.4.1 2008/11/03 15:16:48 Exp $ + * $Id: aiutils.c,v 1.6.4.7.4.5 2009/09/25 00:32:01 Exp $ */ #include <typedefs.h> @@ -36,6 +36,11 @@ #include "siutils_priv.h" +STATIC uint32 +get_asd(si_t *sih, uint32 *eromptr, uint sp, uint ad, uint st, + uint32 *addrl, uint32 *addrh, uint32 *sizel, uint32 *sizeh); + + /* EROM parsing */ static uint32 @@ -71,7 +76,7 @@ get_erom_ent(si_t *sih, uint32 *eromptr, uint32 mask, uint32 match) return ent; } -static uint32 +STATIC uint32 get_asd(si_t *sih, uint32 *eromptr, uint sp, uint ad, uint st, uint32 *addrl, uint32 *addrh, uint32 *sizel, uint32 *sizeh) { @@ -422,6 +427,15 @@ ai_setint(si_t *sih, int siflag) { } +void +ai_write_wrap_reg(si_t *sih, uint32 offset, uint32 val) +{ + si_info_t *sii = SI_INFO(sih); + aidmp_t *ai = sii->curwrap; + W_REG(sii->osh, (uint32 *)((uint8 *)ai+offset), val); + return; +} + uint ai_corevendor(si_t *sih) { @@ -482,6 +496,9 @@ ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) ASSERT(regoff < SI_CORE_SIZE); ASSERT((val & ~mask) == 0); + if (coreidx >= SI_MAXCORES) + return 0; + if (BUSTYPE(sih->bustype) == SI_BUS) { /* If internal bus, we can always get at everything */ fast = TRUE; diff --git a/bcm4329/src/shared/bcmutils.c b/bcm4329/src/shared/bcmutils.c index 2741824..9805ee6 100644 --- a/bcm4329/src/shared/bcmutils.c +++ b/bcm4329/src/shared/bcmutils.c @@ -20,7 +20,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmutils.c,v 1.210.4.5.2.4.6.9 2009/05/22 20:49:24 Exp $ + * $Id: bcmutils.c,v 1.210.4.5.2.4.6.16 2009/10/28 18:25:42 Exp $ */ #include <typedefs.h> @@ -45,6 +45,7 @@ #ifdef BCMDRIVER + /* copy a pkt buffer chain into a buffer */ uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf) @@ -665,7 +666,8 @@ bcmstrncat(char *dest, const char *src, uint size) * Returns: Pointer to the next token found. NULL when no more tokens are found. ***************************************************************************** */ -char* bcmstrtok(char **string, const char *delimiters, char *tokdelim) +char * +bcmstrtok(char **string, const char *delimiters, char *tokdelim) { unsigned char *str; unsigned long map[8]; @@ -742,7 +744,8 @@ char* bcmstrtok(char **string, const char *delimiters, char *tokdelim) * t1 > t2, when ignoring case sensitivity. ***************************************************************************** */ -int bcmstricmp(const char *s1, const char *s2) +int +bcmstricmp(const char *s1, const char *s2) { char dc, sc; @@ -775,7 +778,8 @@ int bcmstricmp(const char *s1, const char *s2) * t1 > t2, when ignoring case sensitivity. ***************************************************************************** */ -int bcmstrnicmp(const char* s1, const char* s2, int cnt) +int +bcmstrnicmp(const char* s1, const char* s2, int cnt) { char dc, sc; @@ -810,18 +814,14 @@ bcm_ether_atoe(char *p, struct ether_addr *ea) return (i == 6); } + #if defined(CONFIG_USBRNDIS_RETAIL) || defined(NDIS_MINIPORT_DRIVER) /* registry routine buffer preparation utility functions: * parameter order is like strncpy, but returns count * of bytes copied. Minimum bytes copied is null char(1)/wchar(2) */ ulong -wchar2ascii( - char *abuf, - ushort *wbuf, - ushort wbuflen, - ulong abuflen -) +wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen) { ulong copyct = 1; ushort i; diff --git a/bcm4329/src/shared/bcmwifi.c b/bcm4329/src/shared/bcmwifi.c index b460d7f..641a4fd 100644 --- a/bcm4329/src/shared/bcmwifi.c +++ b/bcm4329/src/shared/bcmwifi.c @@ -22,7 +22,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmwifi.c,v 1.18.24.2 2008/08/01 21:52:06 Exp $ + * $Id: bcmwifi.c,v 1.18.24.2.4.1 2009/09/25 00:32:01 Exp $ */ @@ -83,7 +83,7 @@ wf_chspec_ntoa(chanspec_t chspec, char *buf) chanspec_t wf_chspec_aton(char *a) { - char *endp; + char *endp = NULL; uint channel, band, bw, ctl_sb; char c; diff --git a/bcm4329/src/shared/hndpmu.c b/bcm4329/src/shared/hndpmu.c index 90116de..25712ac 100644 --- a/bcm4329/src/shared/hndpmu.c +++ b/bcm4329/src/shared/hndpmu.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: hndpmu.c,v 1.95.2.17.4.11.2.39 2009/06/25 16:07:18 Exp $ + * $Id: hndpmu.c,v 1.95.2.17.4.11.2.50 2009/10/26 14:45:51 Exp $ */ #include <typedefs.h> @@ -70,7 +70,7 @@ void si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) { chipcregs_t *cc; - uint origidx, intr_val; + uint origidx, intr_val = 0; sdiod_drive_str_t *str_tab = NULL; uint32 str_mask = 0; uint32 str_shift = 0; diff --git a/bcm4329/src/shared/linux_osl.c b/bcm4329/src/shared/linux_osl.c index 7fb59e4..4cf658b 100644 --- a/bcm4329/src/shared/linux_osl.c +++ b/bcm4329/src/shared/linux_osl.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.c,v 1.125.12.3.8.2 2009/06/18 02:31:41 Exp $ + * $Id: linux_osl.c,v 1.125.12.3.8.5 2009/10/27 04:43:04 Exp $ */ @@ -41,6 +41,28 @@ #define OS_HANDLE_MAGIC 0x1234abcd #define BCM_MEM_FILENAME_LEN 24 +#ifdef DHD_USE_STATIC_BUF +#define MAX_STATIC_BUF_NUM 16 +#define STATIC_BUF_SIZE (PAGE_SIZE*2) +#define STATIC_BUF_TOTAL_LEN (MAX_STATIC_BUF_NUM*STATIC_BUF_SIZE) +typedef struct bcm_static_buf { + struct semaphore static_sem; + unsigned char *buf_ptr; + unsigned char buf_use[MAX_STATIC_BUF_NUM]; +} bcm_static_buf_t; + +static bcm_static_buf_t *bcm_static_buf = 0; + +#define MAX_STATIC_PKT_NUM 8 +typedef struct bcm_static_pkt { + struct sk_buff *skb_4k[MAX_STATIC_PKT_NUM]; + struct sk_buff *skb_8k[MAX_STATIC_PKT_NUM]; + struct semaphore osl_pkt_sem; + unsigned char pkt_use[MAX_STATIC_PKT_NUM*2]; +} bcm_static_pkt_t; +static bcm_static_pkt_t *bcm_static_skb = 0; + +#endif typedef struct bcm_mem_link { struct bcm_mem_link *prev; struct bcm_mem_link *next; @@ -121,6 +143,7 @@ osl_error(int bcmerror) return linuxbcmerrormap[-bcmerror]; } +void * dhd_os_prealloc(int section, unsigned long size); osl_t * osl_attach(void *pdev, uint bustype, bool pkttag) { @@ -159,6 +182,39 @@ osl_attach(void *pdev, uint bustype, bool pkttag) break; } +#ifdef DHD_USE_STATIC_BUF + + + if (!bcm_static_buf) { + if (!(bcm_static_buf = (bcm_static_buf_t *)dhd_os_prealloc(3, STATIC_BUF_SIZE+ + STATIC_BUF_TOTAL_LEN))) { + printk("can not alloc static buf!\n"); + } + else + printk("alloc static buf at %x!\n", (unsigned int)bcm_static_buf); + + + init_MUTEX(&bcm_static_buf->static_sem); + + + 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(4, 0); + + bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *)*16); + for (i = 0; i < MAX_STATIC_PKT_NUM*2; i++) + bcm_static_skb->pkt_use[i] = 0; + + init_MUTEX(&bcm_static_skb->osl_pkt_sem); + } +#endif return osh; } @@ -168,6 +224,14 @@ osl_detach(osl_t *osh) if (osh == NULL) return; +#ifdef DHD_USE_STATIC_BUF + if (bcm_static_buf) { + bcm_static_buf = 0; + } + if (bcm_static_skb) { + bcm_static_skb = 0; + } +#endif ASSERT(osh->magic == OS_HANDLE_MAGIC); kfree(osh); } @@ -220,6 +284,90 @@ osl_pktfree(osl_t *osh, void *p, bool send) } } +#ifdef DHD_USE_STATIC_BUF +void* +osl_pktget_static(osl_t *osh, uint len) +{ + int i = 0; + struct sk_buff *skb; + + + if (len > (PAGE_SIZE*2)) + { + printk("Do we really need this big skb??\n"); + return osl_pktget(osh, len); + } + + + down(&bcm_static_skb->osl_pkt_sem); + if (len <= PAGE_SIZE) + { + + for (i = 0; i < MAX_STATIC_PKT_NUM; i++) + { + if (bcm_static_skb->pkt_use[i] == 0) + break; + } + + if (i != MAX_STATIC_PKT_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; + + return skb; + } + } + + + for (i = 0; i < MAX_STATIC_PKT_NUM; i++) + { + if (bcm_static_skb->pkt_use[i+MAX_STATIC_PKT_NUM] == 0) + break; + } + + if (i != MAX_STATIC_PKT_NUM) + { + bcm_static_skb->pkt_use[i+MAX_STATIC_PKT_NUM] = 1; + up(&bcm_static_skb->osl_pkt_sem); + skb = bcm_static_skb->skb_8k[i]; + skb->tail = skb->data + len; + skb->len = len; + + return skb; + } + + + + up(&bcm_static_skb->osl_pkt_sem); + printk("all static pkt in use!\n"); + return osl_pktget(osh, len); +} + + +void +osl_pktfree_static(osl_t *osh, void *p, bool send) +{ + int i; + + for (i = 0; i < MAX_STATIC_PKT_NUM*2; 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; + } + } + return osl_pktfree(osh, p, send); +} +#endif uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size) { @@ -307,6 +455,40 @@ osl_malloc(osl_t *osh, uint size) if (osh) ASSERT(osh->magic == OS_HANDLE_MAGIC); +#ifdef DHD_USE_STATIC_BUF + if (bcm_static_buf) + { + int i = 0; + if ((size >= PAGE_SIZE)&&(size <= STATIC_BUF_SIZE)) + { + down(&bcm_static_buf->static_sem); + + for (i = 0; i < MAX_STATIC_BUF_NUM; i++) + { + if (bcm_static_buf->buf_use[i] == 0) + break; + } + + if (i == MAX_STATIC_BUF_NUM) + { + up(&bcm_static_buf->static_sem); + printk("all static buff in use!\n"); + goto original; + } + + bcm_static_buf->buf_use[i] = 1; + up(&bcm_static_buf->static_sem); + + bzero(bcm_static_buf->buf_ptr+STATIC_BUF_SIZE*i, size); + if (osh) + osh->malloced += size; + + return ((void *)(bcm_static_buf->buf_ptr+STATIC_BUF_SIZE*i)); + } + } +original: +#endif + if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { if (osh) osh->failed++; @@ -321,6 +503,28 @@ osl_malloc(osl_t *osh, uint size) void osl_mfree(osl_t *osh, void *addr, uint size) { +#ifdef DHD_USE_STATIC_BUF + if (bcm_static_buf) + { + if ((addr > (void *)bcm_static_buf) && ((unsigned char *)addr \ + <= ((unsigned char *)bcm_static_buf + STATIC_BUF_TOTAL_LEN))) + { + int buf_idx = 0; + + buf_idx = ((unsigned char *)addr - bcm_static_buf->buf_ptr)/STATIC_BUF_SIZE; + + down(&bcm_static_buf->static_sem); + bcm_static_buf->buf_use[buf_idx] = 0; + up(&bcm_static_buf->static_sem); + + if (osh) { + ASSERT(osh->magic == OS_HANDLE_MAGIC); + osh->malloced -= size; + } + return; + } + } +#endif if (osh) { ASSERT(osh->magic == OS_HANDLE_MAGIC); osh->malloced -= size; diff --git a/bcm4329/src/shared/miniopt.c b/bcm4329/src/shared/miniopt.c index de00b6c..44199ea 100644 --- a/bcm4329/src/shared/miniopt.c +++ b/bcm4329/src/shared/miniopt.c @@ -20,7 +20,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: miniopt.c,v 1.1.6.3 2009/01/14 23:52:06 Exp $ + * $Id: miniopt.c,v 1.1.6.4 2009/09/25 00:32:01 Exp $ */ /* ---- Include Files ---------------------------------------------------- */ @@ -62,7 +62,7 @@ int miniopt(miniopt_t *t, char **argv) { int keylen; - char *p, *eq, *valstr, *endptr; + char *p, *eq, *valstr, *endptr = NULL; int err = 0; t->consumed = 0; diff --git a/bcm4329/src/shared/sbutils.c b/bcm4329/src/shared/sbutils.c index cbe4438..567e94e 100644 --- a/bcm4329/src/shared/sbutils.c +++ b/bcm4329/src/shared/sbutils.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbutils.c,v 1.662.4.10.2.7 2008/08/06 03:43:24 Exp $ + * $Id: sbutils.c,v 1.662.4.10.2.7.4.1 2009/09/25 00:32:01 Exp $ */ #include <typedefs.h> @@ -363,6 +363,9 @@ sb_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) ASSERT(regoff < SI_CORE_SIZE); ASSERT((val & ~mask) == 0); + if (coreidx >= SI_MAXCORES) + return 0; + if (BUSTYPE(sii->pub.bustype) == SI_BUS) { /* If internal bus, we can always get at everything */ fast = TRUE; diff --git a/bcm4329/src/shared/siutils.c b/bcm4329/src/shared/siutils.c index 988dda1..df34986 100644 --- a/bcm4329/src/shared/siutils.c +++ b/bcm4329/src/shared/siutils.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils.c,v 1.662.4.4.4.16.4.20 2009/06/25 16:07:18 Exp $ + * $Id: siutils.c,v 1.662.4.4.4.16.4.25 2009/09/22 13:32:03 Exp $ */ #include <typedefs.h> @@ -661,10 +661,6 @@ si_setcore(si_t *sih, uint coreid, uint coreunit) { uint idx; - if (!sih) { - printk("%s: Null, %u, %u\n", __func__, coreid, coreunit); - return NULL; - } idx = si_findcoreidx(sih, coreid, coreunit); if (!GOODIDX(idx)) return (NULL); @@ -808,6 +804,19 @@ si_iscoreup(si_t *sih) } } +void +si_write_wrapperreg(si_t *sih, uint32 offset, uint32 val) +{ + /* only for 4319, no requirement for SOCI_SB */ + if (CHIPTYPE(sih->socitype) == SOCI_AI) { + ai_write_wrap_reg(sih, offset, val); + } + else + return; + + return; +} + uint si_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) { @@ -1013,7 +1022,7 @@ si_sdio_init(si_t *sih) { si_info_t *sii = SI_INFO(sih); - if (((sih->buscoretype == PCMCIA_CORE_ID) && (sih->buscorerev >= 8)) || \ + if (((sih->buscoretype == PCMCIA_CORE_ID) && (sih->buscorerev >= 8)) || (sih->buscoretype == SDIOD_CORE_ID)) { uint idx; sdpcmd_regs_t *sdpregs; diff --git a/bcm4329/src/shared/siutils_priv.h b/bcm4329/src/shared/siutils_priv.h index 1192168..1ec59aa 100644 --- a/bcm4329/src/shared/siutils_priv.h +++ b/bcm4329/src/shared/siutils_priv.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: siutils_priv.h,v 1.3.10.5 2008/08/06 06:28:10 Exp $ + * $Id: siutils_priv.h,v 1.3.10.5.4.2 2009/09/22 13:28:16 Exp $ */ #ifndef _siutils_priv_h_ @@ -207,6 +207,7 @@ extern void ai_core_disable(si_t *sih, uint32 bits); extern int ai_numaddrspaces(si_t *sih); extern uint32 ai_addrspace(si_t *sih, uint asidx); extern uint32 ai_addrspacesize(si_t *sih, uint asidx); +extern void ai_write_wrap_reg(si_t *sih, uint32 offset, uint32 val); #endif /* _siutils_priv_h_ */ |