diff options
author | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
---|---|---|
committer | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
commit | 871480933a1c28f8a9fed4c4d34d06c439a7a422 (patch) | |
tree | 8718f573808810c2a1e8cb8fb6ac469093ca2784 /ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c | |
parent | 9d40ac5867b9aefe0722bc1f110b965ff294d30d (diff) | |
download | FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.gz FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.bz2 FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.zip |
Moved, renamed, and deleted files
The original directory structure was scattered and unorganized.
Changes are basically to make it look like kernel structure.
Diffstat (limited to 'ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c')
-rwxr-xr-x | ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c | 1138 |
1 files changed, 0 insertions, 1138 deletions
diff --git a/ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c b/ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c deleted file mode 100755 index 37fdb2ea..00000000 --- a/ANDROID_3.4.5/drivers/net/wireless/bcmdhd.1.28.23.x.cn_ap6330/linux_osl.c +++ /dev/null @@ -1,1138 +0,0 @@ -/* - * Linux OS Independent Layer - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * 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: linux_osl.c 373382 2012-12-07 07:59:52Z $ - */ - -#define LINUX_PORT - -#include <typedefs.h> -#include <bcmendian.h> -#include <linuxver.h> -#include <bcmdefs.h> -#include <osl.h> -#include <bcmutils.h> -#include <linux/delay.h> -#include <pcicfg.h> - - -#include <linux/fs.h> - -#define PCI_CFG_RETRY 10 - -#define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognize osh */ -#define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */ - -#ifdef CONFIG_DHD_USE_STATIC_BUF -#define DHD_SKB_HDRSIZE 336 -#define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) -#define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) -#define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) - -#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) - -typedef struct bcm_static_buf { - struct semaphore static_sem; - unsigned char *buf_ptr; - unsigned char buf_use[STATIC_BUF_MAX_NUM]; -} bcm_static_buf_t; - -static bcm_static_buf_t *bcm_static_buf = 0; - -#define STATIC_PKT_MAX_NUM 8 -#if defined(ENHANCED_STATIC_BUF) -#define STATIC_PKT_4PAGE_NUM 1 -#define DHD_SKB_MAX_BUFSIZE DHD_SKB_4PAGE_BUFSIZE -#else -#define STATIC_PKT_4PAGE_NUM 0 -#define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE -#endif /* ENHANCED_STATIC_BUF */ - -typedef struct bcm_static_pkt { - struct sk_buff *skb_4k[STATIC_PKT_MAX_NUM]; - struct sk_buff *skb_8k[STATIC_PKT_MAX_NUM]; -#ifdef ENHANCED_STATIC_BUF - struct sk_buff *skb_16k; -#endif - struct semaphore osl_pkt_sem; - unsigned char pkt_use[STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM]; -} bcm_static_pkt_t; - -static bcm_static_pkt_t *bcm_static_skb = 0; -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - -typedef struct bcm_mem_link { - struct bcm_mem_link *prev; - struct bcm_mem_link *next; - uint size; - int line; - void *osh; - char file[BCM_MEM_FILENAME_LEN]; -} bcm_mem_link_t; - -struct osl_info { - osl_pubinfo_t pub; -#ifdef CTFPOOL - ctfpool_t *ctfpool; -#endif /* CTFPOOL */ - uint magic; - void *pdev; - atomic_t malloced; - uint failed; - uint bustype; - bcm_mem_link_t *dbgmem_list; - spinlock_t dbgmem_lock; - spinlock_t pktalloc_lock; -}; - -/* PCMCIA attribute space access macros */ - -/* Global ASSERT type flag */ -uint32 g_assert_type = FALSE; - -static int16 linuxbcmerrormap[] = -{ 0, /* 0 */ - -EINVAL, /* BCME_ERROR */ - -EINVAL, /* BCME_BADARG */ - -EINVAL, /* BCME_BADOPTION */ - -EINVAL, /* BCME_NOTUP */ - -EINVAL, /* BCME_NOTDOWN */ - -EINVAL, /* BCME_NOTAP */ - -EINVAL, /* BCME_NOTSTA */ - -EINVAL, /* BCME_BADKEYIDX */ - -EINVAL, /* BCME_RADIOOFF */ - -EINVAL, /* BCME_NOTBANDLOCKED */ - -EINVAL, /* BCME_NOCLK */ - -EINVAL, /* BCME_BADRATESET */ - -EINVAL, /* BCME_BADBAND */ - -E2BIG, /* BCME_BUFTOOSHORT */ - -E2BIG, /* BCME_BUFTOOLONG */ - -EBUSY, /* BCME_BUSY */ - -EINVAL, /* BCME_NOTASSOCIATED */ - -EINVAL, /* BCME_BADSSIDLEN */ - -EINVAL, /* BCME_OUTOFRANGECHAN */ - -EINVAL, /* BCME_BADCHAN */ - -EFAULT, /* BCME_BADADDR */ - -ENOMEM, /* BCME_NORESOURCE */ - -EOPNOTSUPP, /* BCME_UNSUPPORTED */ - -EMSGSIZE, /* BCME_BADLENGTH */ - -EINVAL, /* BCME_NOTREADY */ - -EPERM, /* BCME_EPERM */ - -ENOMEM, /* BCME_NOMEM */ - -EINVAL, /* BCME_ASSOCIATED */ - -ERANGE, /* BCME_RANGE */ - -EINVAL, /* BCME_NOTFOUND */ - -EINVAL, /* BCME_WME_NOT_ENABLED */ - -EINVAL, /* BCME_TSPEC_NOTFOUND */ - -EINVAL, /* BCME_ACM_NOTSUPPORTED */ - -EINVAL, /* BCME_NOT_WME_ASSOCIATION */ - -EIO, /* BCME_SDIO_ERROR */ - -ENODEV, /* BCME_DONGLE_DOWN */ - -EINVAL, /* BCME_VERSION */ - -EIO, /* BCME_TXFAIL */ - -EIO, /* BCME_RXFAIL */ - -ENODEV, /* BCME_NODEVICE */ - -EINVAL, /* BCME_NMODE_DISABLED */ - -ENODATA, /* BCME_NONRESIDENT */ - -/* When an new error code is added to bcmutils.h, add os - * specific error translation here as well - */ -/* check if BCME_LAST changed since the last time this function was updated */ -#if BCME_LAST != -42 -#error "You need to add a OS error translation in the linuxbcmerrormap \ - for new error code defined in bcmutils.h" -#endif -}; - -/* translate bcmerrors into linux errors */ -int -osl_error(int bcmerror) -{ - if (bcmerror > 0) - bcmerror = 0; - else if (bcmerror < BCME_LAST) - bcmerror = BCME_ERROR; - - /* Array bounds covered by ASSERT in osl_attach */ - return linuxbcmerrormap[-bcmerror]; -} - -extern uint8* dhd_os_prealloc(void *osh, int section, int size); - -osl_t * -osl_attach(void *pdev, uint bustype, bool pkttag) -{ - osl_t *osh; - - if (!(osh = kmalloc(sizeof(osl_t), GFP_ATOMIC))) - return osh; - - ASSERT(osh); - - bzero(osh, sizeof(osl_t)); - - /* Check that error map has the right number of entries in it */ - ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(linuxbcmerrormap) - 1)); - - osh->magic = OS_HANDLE_MAGIC; - atomic_set(&osh->malloced, 0); - osh->failed = 0; - osh->dbgmem_list = NULL; - spin_lock_init(&(osh->dbgmem_lock)); - osh->pdev = pdev; - osh->pub.pkttag = pkttag; - osh->bustype = bustype; - - switch (bustype) { - case PCI_BUS: - case SI_BUS: - case PCMCIA_BUS: - osh->pub.mmbus = TRUE; - break; - case JTAG_BUS: - case SDIO_BUS: - case USB_BUS: - case SPI_BUS: - case RPC_BUS: - osh->pub.mmbus = FALSE; - break; - default: - ASSERT(FALSE); - break; - } - -#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))) { - printk("can not alloc static buf!\n"); - } - 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 *)* - (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM)); - for (i = 0; i < (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM); i++) - bcm_static_skb->pkt_use[i] = 0; - - sema_init(&bcm_static_skb->osl_pkt_sem, 1); - } -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - - spin_lock_init(&(osh->pktalloc_lock)); - - return osh; -} - -void -osl_detach(osl_t *osh) -{ - if (osh == NULL) - return; - -#ifdef CONFIG_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); -} - -static struct sk_buff *osl_alloc_skb(unsigned int len) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) - return __dev_alloc_skb(len, GFP_ATOMIC); -#else - return dev_alloc_skb(len); -#endif -} - -#ifdef CTFPOOL - -#ifdef CTFPOOL_SPINLOCK -#define CTFPOOL_LOCK(ctfpool, flags) spin_lock_irqsave(&(ctfpool)->lock, flags) -#define CTFPOOL_UNLOCK(ctfpool, flags) spin_unlock_irqrestore(&(ctfpool)->lock, flags) -#else -#define CTFPOOL_LOCK(ctfpool, flags) spin_lock_bh(&(ctfpool)->lock) -#define CTFPOOL_UNLOCK(ctfpool, flags) spin_unlock_bh(&(ctfpool)->lock) -#endif /* CTFPOOL_SPINLOCK */ -/* - * Allocate and add an object to packet pool. - */ -void * -osl_ctfpool_add(osl_t *osh) -{ - struct sk_buff *skb; -#ifdef CTFPOOL_SPINLOCK - unsigned long flags; -#endif /* CTFPOOL_SPINLOCK */ - - if ((osh == NULL) || (osh->ctfpool == NULL)) - return NULL; - - CTFPOOL_LOCK(osh->ctfpool, flags); - ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj); - - /* No need to allocate more objects */ - if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) { - CTFPOOL_UNLOCK(osh->ctfpool, flags); - return NULL; - } - - /* Allocate a new skb and add it to the ctfpool */ - skb = osl_alloc_skb(osh->ctfpool->obj_size); - if (skb == NULL) { - printf("%s: skb alloc of len %d failed\n", __FUNCTION__, - osh->ctfpool->obj_size); - CTFPOOL_UNLOCK(osh->ctfpool, flags); - return NULL; - } - - /* Add to ctfpool */ - skb->next = (struct sk_buff *)osh->ctfpool->head; - osh->ctfpool->head = skb; - osh->ctfpool->fast_frees++; - osh->ctfpool->curr_obj++; - - /* Hijack a skb member to store ptr to ctfpool */ - CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool; - - /* Use bit flag to indicate skb from fast ctfpool */ - PKTFAST(osh, skb) = FASTBUF; - - CTFPOOL_UNLOCK(osh->ctfpool, flags); - - return skb; -} - -/* - * Add new objects to the pool. - */ -void -osl_ctfpool_replenish(osl_t *osh, uint thresh) -{ - if ((osh == NULL) || (osh->ctfpool == NULL)) - return; - - /* Do nothing if no refills are required */ - while ((osh->ctfpool->refills > 0) && (thresh--)) { - osl_ctfpool_add(osh); - osh->ctfpool->refills--; - } -} - -/* - * Initialize the packet pool with specified number of objects. - */ -int32 -osl_ctfpool_init(osl_t *osh, uint numobj, uint size) -{ - osh->ctfpool = kmalloc(sizeof(ctfpool_t), GFP_ATOMIC); - ASSERT(osh->ctfpool); - bzero(osh->ctfpool, sizeof(ctfpool_t)); - - osh->ctfpool->max_obj = numobj; - osh->ctfpool->obj_size = size; - - spin_lock_init(&osh->ctfpool->lock); - - while (numobj--) { - if (!osl_ctfpool_add(osh)) - return -1; - osh->ctfpool->fast_frees--; - } - - return 0; -} - -/* - * Cleanup the packet pool objects. - */ -void -osl_ctfpool_cleanup(osl_t *osh) -{ - struct sk_buff *skb, *nskb; -#ifdef CTFPOOL_SPINLOCK - unsigned long flags; -#endif /* CTFPOOL_SPINLOCK */ - - if ((osh == NULL) || (osh->ctfpool == NULL)) - return; - - CTFPOOL_LOCK(osh->ctfpool, flags); - - skb = osh->ctfpool->head; - - while (skb != NULL) { - nskb = skb->next; - dev_kfree_skb(skb); - skb = nskb; - osh->ctfpool->curr_obj--; - } - - ASSERT(osh->ctfpool->curr_obj == 0); - osh->ctfpool->head = NULL; - CTFPOOL_UNLOCK(osh->ctfpool, flags); - - kfree(osh->ctfpool); - osh->ctfpool = NULL; -} - -void -osl_ctfpool_stats(osl_t *osh, void *b) -{ - struct bcmstrbuf *bb; - - if ((osh == NULL) || (osh->ctfpool == NULL)) - return; - -#ifdef CONFIG_DHD_USE_STATIC_BUF - if (bcm_static_buf) { - bcm_static_buf = 0; - } - if (bcm_static_skb) { - bcm_static_skb = 0; - } -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - - bb = b; - - ASSERT((osh != NULL) && (bb != NULL)); - - bcm_bprintf(bb, "max_obj %d obj_size %d curr_obj %d refills %d\n", - osh->ctfpool->max_obj, osh->ctfpool->obj_size, - osh->ctfpool->curr_obj, osh->ctfpool->refills); - bcm_bprintf(bb, "fast_allocs %d fast_frees %d slow_allocs %d\n", - osh->ctfpool->fast_allocs, osh->ctfpool->fast_frees, - osh->ctfpool->slow_allocs); -} - -static inline struct sk_buff * -osl_pktfastget(osl_t *osh, uint len) -{ - struct sk_buff *skb; -#ifdef CTFPOOL_SPINLOCK - unsigned long flags; -#endif /* CTFPOOL_SPINLOCK */ - - /* Try to do fast allocate. Return null if ctfpool is not in use - * or if there are no items in the ctfpool. - */ - if (osh->ctfpool == NULL) - return NULL; - - CTFPOOL_LOCK(osh->ctfpool, flags); - if (osh->ctfpool->head == NULL) { - ASSERT(osh->ctfpool->curr_obj == 0); - osh->ctfpool->slow_allocs++; - CTFPOOL_UNLOCK(osh->ctfpool, flags); - return NULL; - } - - ASSERT(len <= osh->ctfpool->obj_size); - - /* Get an object from ctfpool */ - skb = (struct sk_buff *)osh->ctfpool->head; - osh->ctfpool->head = (void *)skb->next; - - osh->ctfpool->fast_allocs++; - osh->ctfpool->curr_obj--; - ASSERT(CTFPOOLHEAD(osh, skb) == (struct sock *)osh->ctfpool->head); - CTFPOOL_UNLOCK(osh->ctfpool, flags); - - /* Init skb struct */ - skb->next = skb->prev = NULL; - skb->data = skb->head + 16; - skb->tail = skb->head + 16; - - skb->len = 0; - skb->cloned = 0; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) - skb->list = NULL; -#endif - atomic_set(&skb->users, 1); - - return skb; -} -#endif /* CTFPOOL */ -/* Convert a driver packet to native(OS) packet - * In the process, packettag is zeroed out before sending up - * IP code depends on skb->cb to be setup correctly with various options - * In our case, that means it should be 0 - */ -struct sk_buff * BCMFASTPATH -osl_pkt_tonative(osl_t *osh, void *pkt) -{ -#ifndef WL_UMK - struct sk_buff *nskb; - unsigned long flags; -#endif - - if (osh->pub.pkttag) - bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); - -#ifndef WL_UMK - /* Decrement the packet counter */ - for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { - spin_lock_irqsave(&osh->pktalloc_lock, flags); - osh->pub.pktalloced--; - spin_unlock_irqrestore(&osh->pktalloc_lock, flags); - } -#endif /* WL_UMK */ - return (struct sk_buff *)pkt; -} - -/* Convert a native(OS) packet to driver packet. - * In the process, native packet is destroyed, there is no copying - * Also, a packettag is zeroed out - */ -void * BCMFASTPATH -osl_pkt_frmnative(osl_t *osh, void *pkt) -{ -#ifndef WL_UMK - struct sk_buff *nskb; - unsigned long flags; -#endif - - if (osh->pub.pkttag) - bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); - -#ifndef WL_UMK - /* Increment the packet counter */ - for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { - spin_lock_irqsave(&osh->pktalloc_lock, flags); - osh->pub.pktalloced++; - spin_unlock_irqrestore(&osh->pktalloc_lock, flags); - } -#endif /* WL_UMK */ - return (void *)pkt; -} - -/* Return a new packet. zero out pkttag */ -void * BCMFASTPATH -osl_pktget(osl_t *osh, uint len) -{ - struct sk_buff *skb; - unsigned long flags; - -#ifdef CTFPOOL - /* Allocate from local pool */ - skb = osl_pktfastget(osh, len); - if ((skb != NULL) || ((skb = osl_alloc_skb(len)) != NULL)) { -#else /* CTFPOOL */ - if ((skb = osl_alloc_skb(len))) { -#endif /* CTFPOOL */ - skb_put(skb, len); - skb->priority = 0; - - - spin_lock_irqsave(&osh->pktalloc_lock, flags); - osh->pub.pktalloced++; - spin_unlock_irqrestore(&osh->pktalloc_lock, flags); - } - - return ((void*) skb); -} - -#ifdef CTFPOOL -static inline void -osl_pktfastfree(osl_t *osh, struct sk_buff *skb) -{ - ctfpool_t *ctfpool; -#ifdef CTFPOOL_SPINLOCK - unsigned long flags; -#endif /* CTFPOOL_SPINLOCK */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) - skb->tstamp.tv.sec = 0; -#else - skb->stamp.tv_sec = 0; -#endif - - /* We only need to init the fields that we change */ - skb->dev = NULL; - skb->dst = NULL; - memset(skb->cb, 0, sizeof(skb->cb)); - skb->ip_summed = 0; - skb->destructor = NULL; - - ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); - ASSERT(ctfpool != NULL); - - /* Add object to the ctfpool */ - CTFPOOL_LOCK(ctfpool, flags); - skb->next = (struct sk_buff *)ctfpool->head; - ctfpool->head = (void *)skb; - - ctfpool->fast_frees++; - ctfpool->curr_obj++; - - ASSERT(ctfpool->curr_obj <= ctfpool->max_obj); - CTFPOOL_UNLOCK(ctfpool, flags); -} -#endif /* CTFPOOL */ - -/* Free the driver packet. Free the tag if present */ -void BCMFASTPATH -osl_pktfree(osl_t *osh, void *p, bool send) -{ - struct sk_buff *skb, *nskb; - unsigned long flags; - - skb = (struct sk_buff*) p; - - if (send && osh->pub.tx_fn) - osh->pub.tx_fn(osh->pub.tx_ctx, p, 0); - - PKTDBG_TRACE(osh, (void *) skb, PKTLIST_PKTFREE); - - /* perversion: we use skb->next to chain multi-skb packets */ - while (skb) { - nskb = skb->next; - skb->next = NULL; - - - -#ifdef CTFPOOL - if ((PKTISFAST(osh, skb)) && (atomic_read(&skb->users) == 1)) - osl_pktfastfree(osh, skb); - else { -#else /* CTFPOOL */ - { -#endif /* CTFPOOL */ - - if (skb->destructor) - /* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if - * destructor exists - */ - dev_kfree_skb_any(skb); - else - /* can free immediately (even in_irq()) if destructor - * does not exist - */ - dev_kfree_skb(skb); - } - spin_lock_irqsave(&osh->pktalloc_lock, flags); - osh->pub.pktalloced--; - spin_unlock_irqrestore(&osh->pktalloc_lock, flags); - skb = nskb; - } -} - -#ifdef CONFIG_DHD_USE_STATIC_BUF -void* -osl_pktget_static(osl_t *osh, uint len) -{ - int i = 0; - struct sk_buff *skb; - - - if (len > DHD_SKB_MAX_BUFSIZE) { - printk("osl_pktget_static: Do we really need this big skb??" - " len=%d\n", len); - return osl_pktget(osh, len); - } - - down(&bcm_static_skb->osl_pkt_sem); - - if (len <= DHD_SKB_1PAGE_BUFSIZE) { - for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { - if (bcm_static_skb->pkt_use[i] == 0) - break; - } - - if (i != STATIC_PKT_MAX_NUM) { - bcm_static_skb->pkt_use[i] = 1; - - skb = bcm_static_skb->skb_4k[i]; - skb->tail = skb->data + len; - skb->len = len; - - up(&bcm_static_skb->osl_pkt_sem); - return skb; - } - } - - if (len <= DHD_SKB_2PAGE_BUFSIZE) { - - for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { - if (bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] - == 0) - break; - } - - if (i != STATIC_PKT_MAX_NUM) { - bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 1; - skb = bcm_static_skb->skb_8k[i]; - skb->tail = skb->data + len; - skb->len = len; - - up(&bcm_static_skb->osl_pkt_sem); - return skb; - } - } - -#if defined(ENHANCED_STATIC_BUF) - if (bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] == 0) { - bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] = 1; - - skb = bcm_static_skb->skb_16k; - skb->tail = skb->data + len; - skb->len = len; - - up(&bcm_static_skb->osl_pkt_sem); - return skb; - } -#endif - - up(&bcm_static_skb->osl_pkt_sem); - printk("osl_pktget_static: all static pkt in use!\n"); - return osl_pktget(osh, len); -} - -void -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]) { - bcm_static_skb->pkt_use[i] = 0; - up(&bcm_static_skb->osl_pkt_sem); - return; - } - } - - for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { - if (p == bcm_static_skb->skb_8k[i]) { - bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 0; - up(&bcm_static_skb->osl_pkt_sem); - return; - } - } -#ifdef ENHANCED_STATIC_BUF - if (p == bcm_static_skb->skb_16k) { - bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM*2] = 0; - up(&bcm_static_skb->osl_pkt_sem); - return; - } -#endif - up(&bcm_static_skb->osl_pkt_sem); - - osl_pktfree(osh, p, send); - return; -} -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - -uint32 -osl_pci_read_config(osl_t *osh, uint offset, uint size) -{ - uint val = 0; - uint retry = PCI_CFG_RETRY; - - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - /* only 4byte access supported */ - ASSERT(size == 4); - - do { - pci_read_config_dword(osh->pdev, offset, &val); - if (val != 0xffffffff) - break; - } while (retry--); - - - return (val); -} - -void -osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val) -{ - uint retry = PCI_CFG_RETRY; - - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - /* only 4byte access supported */ - ASSERT(size == 4); - - do { - pci_write_config_dword(osh->pdev, offset, val); - if (offset != PCI_BAR0_WIN) - break; - if (osl_pci_read_config(osh, offset, size) == val) - break; - } while (retry--); - -} - -/* return bus # for the pci device pointed by osh->pdev */ -uint -osl_pci_bus(osl_t *osh) -{ - ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); - - return ((struct pci_dev *)osh->pdev)->bus->number; -} - -/* return slot # for the pci device pointed by osh->pdev */ -uint -osl_pci_slot(osl_t *osh) -{ - ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); - - return PCI_SLOT(((struct pci_dev *)osh->pdev)->devfn); -} - -/* return the pci device pointed by osh->pdev */ -struct pci_dev * -osl_pci_device(osl_t *osh) -{ - ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); - - return osh->pdev; -} - -static void -osl_pcmcia_attr(osl_t *osh, uint offset, char *buf, int size, bool write) -{ -} - -void -osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size) -{ - osl_pcmcia_attr(osh, offset, (char *) buf, size, FALSE); -} - -void -osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size) -{ - osl_pcmcia_attr(osh, offset, (char *) buf, size, TRUE); -} - -void * -osl_malloc(osl_t *osh, uint size) -{ - void *addr; - - /* only ASSERT if osh is defined */ - if (osh) - ASSERT(osh->magic == OS_HANDLE_MAGIC); - -#ifdef CONFIG_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 < STATIC_BUF_MAX_NUM; i++) - { - if (bcm_static_buf->buf_use[i] == 0) - break; - } - - if (i == STATIC_BUF_MAX_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) - atomic_add(size, &osh->malloced); - - return ((void *)(bcm_static_buf->buf_ptr+STATIC_BUF_SIZE*i)); - } - } -original: -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - - if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { - if (osh) - osh->failed++; - return (NULL); - } - if (osh) - atomic_add(size, &osh->malloced); - - return (addr); -} - -void -osl_mfree(osl_t *osh, void *addr, uint size) -{ -#ifdef CONFIG_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); - atomic_sub(size, &osh->malloced); - } - return; - } - } -#endif /* CONFIG_DHD_USE_STATIC_BUF */ - if (osh) { - ASSERT(osh->magic == OS_HANDLE_MAGIC); - atomic_sub(size, &osh->malloced); - } - kfree(addr); -} - -uint -osl_malloced(osl_t *osh) -{ - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - return (atomic_read(&osh->malloced)); -} - -uint -osl_malloc_failed(osl_t *osh) -{ - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - return (osh->failed); -} - - -uint -osl_dma_consistent_align(void) -{ - return (PAGE_SIZE); -} - -void* -osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align_bits, uint *alloced, ulong *pap) -{ - uint16 align = (1 << align_bits); - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - if (!ISALIGNED(DMA_CONSISTENT_ALIGN, align)) - size += align; - *alloced = size; - - return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap)); -} - -void -osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa) -{ - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - - pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa); -} - -uint BCMFASTPATH -osl_dma_map(osl_t *osh, void *va, uint size, int direction) -{ - int dir; - - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; - return (pci_map_single(osh->pdev, va, size, dir)); -} - -void BCMFASTPATH -osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction) -{ - int dir; - - ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); - dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; - pci_unmap_single(osh->pdev, (uint32)pa, size, dir); -} - -#if defined(BCMASSERT_LOG) -void -osl_assert(const char *exp, const char *file, int line) -{ - char tempbuf[256]; - const char *basename; - - basename = strrchr(file, '/'); - /* skip the '/' */ - if (basename) - basename++; - - if (!basename) - basename = file; - - snprintf(tempbuf, 64, "\"%s\": file \"%s\", line %d\n", - exp, basename, line); - - printk("%s", tempbuf); - - -} -#endif - -void -osl_delay(uint usec) -{ - uint d; - - while (usec > 0) { - d = MIN(usec, 1000); - udelay(d); - usec -= d; - } -} - - -/* Clone a packet. - * The pkttag contents are NOT cloned. - */ -void * -osl_pktdup(osl_t *osh, void *skb) -{ - void * p; - unsigned long irqflags; - - /* clear the CTFBUF flag if set and map the rest of the buffer - * before cloning. - */ - PKTCTFMAP(osh, skb); - - if ((p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) - return NULL; - -#ifdef CTFPOOL - if (PKTISFAST(osh, skb)) { - ctfpool_t *ctfpool; - - /* if the buffer allocated from ctfpool is cloned then - * we can't be sure when it will be freed. since there - * is a chance that we will be losing a buffer - * from our pool, we increment the refill count for the - * object to be alloced later. - */ - ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); - ASSERT(ctfpool != NULL); - PKTCLRFAST(osh, p); - PKTCLRFAST(osh, skb); - ctfpool->refills++; - } -#endif /* CTFPOOL */ - - /* skb_clone copies skb->cb.. we don't want that */ - if (osh->pub.pkttag) - bzero((void*)((struct sk_buff *)p)->cb, OSL_PKTTAG_SZ); - - /* Increment the packet counter */ - spin_lock_irqsave(&osh->pktalloc_lock, irqflags); - osh->pub.pktalloced++; - spin_unlock_irqrestore(&osh->pktalloc_lock, irqflags); - return (p); -} - - -/* - * OSLREGOPS specifies the use of osl_XXX routines to be used for register access - */ - -/* - * BINOSL selects the slightly slower function-call-based binary compatible osl. - */ - -/* Linux Kernel: File Operations: start */ -void * -osl_os_open_image(char *filename) -{ - struct file *fp; - - fp = filp_open(filename, O_RDONLY, 0); - /* - * 2.6.11 (FC4) supports filp_open() but later revs don't? - * Alternative: - * fp = open_namei(AT_FDCWD, filename, O_RD, 0); - * ??? - */ - if (IS_ERR(fp)) - fp = NULL; - - return fp; -} - -int -osl_os_get_image_block(char *buf, int len, void *image) -{ - struct file *fp = (struct file *)image; - int rdlen; - - if (!image) - return 0; - - rdlen = kernel_read(fp, fp->f_pos, buf, len); - if (rdlen > 0) - fp->f_pos += rdlen; - - return rdlen; -} - -void -osl_os_close_image(void *image) -{ - if (image) - filp_close((struct file *)image, NULL); -} -/* Linux Kernel: File Operations: end */ |