staging: brcm80211: remove OSL_DELAY
[pandora-kernel.git] / drivers / staging / brcm80211 / util / linux_osl.c
index c762896..6616174 100644 (file)
 #define OS_HANDLE_MAGIC                0x1234abcd      /* Magic # to recognise osh */
 #define BCM_MEM_FILENAME_LEN   24      /* Mem. filename length */
 
-typedef struct bcm_mem_link {
-       struct bcm_mem_link *prev;
-       struct bcm_mem_link *next;
-       uint size;
-       int line;
-       char file[BCM_MEM_FILENAME_LEN];
-} bcm_mem_link_t;
+#if defined(BRCM_FULLMAC) && defined(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;
+
+#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;
+#endif                         /* DHD_USE_STATIC_BUF */
 
 struct osl_info {
        osl_pubinfo_t pub;
@@ -48,13 +62,13 @@ struct osl_info {
        uint malloced;
        uint failed;
        uint bustype;
-       bcm_mem_link_t *dbgmem_list;
 };
 
 /* Global ASSERT type flag */
-uint32 g_assert_type;
+u32 g_assert_type;
 
-static int16 linuxbcmerrormap[] = { 0, /* 0 */
+#ifdef BRCM_FULLMAC
+static s16 linuxbcmerrormap[] = { 0,   /* 0 */
        -EINVAL,                /* BCME_ERROR */
        -EINVAL,                /* BCME_BADARG */
        -EINVAL,                /* BCME_BADOPTION */
@@ -119,6 +133,7 @@ int osl_error(int bcmerror)
        /* Array bounds covered by ASSERT in osl_attach */
        return linuxbcmerrormap[-bcmerror];
 }
+#endif /* BRCM_FULLMAC */
 
 osl_t *osl_attach(void *pdev, uint bustype, bool pkttag)
 {
@@ -129,13 +144,14 @@ osl_t *osl_attach(void *pdev, uint bustype, bool pkttag)
 
        bzero(osh, sizeof(osl_t));
 
+#ifdef BRCM_FULLMAC
        /* Check that error map has the right number of entries in it */
-       ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(linuxbcmerrormap) - 1));
+       ASSERT(ABS(BCME_LAST) == (ARRAY_SIZE(linuxbcmerrormap) - 1));
+#endif /* BRCM_FULLMAC */
 
        osh->magic = OS_HANDLE_MAGIC;
        osh->malloced = 0;
        osh->failed = 0;
-       osh->dbgmem_list = NULL;
        osh->pdev = pdev;
        osh->pub.pkttag = pkttag;
        osh->bustype = bustype;
@@ -143,21 +159,55 @@ osl_t *osl_attach(void *pdev, uint bustype, bool pkttag)
        switch (bustype) {
        case PCI_BUS:
        case SI_BUS:
-               osh->pub.mmbus = TRUE;
+       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;
+               osh->pub.mmbus = false;
                break;
        default:
-               ASSERT(FALSE);
+               ASSERT(false);
                break;
        }
 
-#ifdef BCMDBG
+#if defined(BRCM_FULLMAC) && defined(DHD_USE_STATIC_BUF)
+       if (!bcm_static_buf) {
+               bcm_static_buf = (bcm_static_buf_t *) dhd_os_prealloc(3,
+                                       STATIC_BUF_SIZE + STATIC_BUF_TOTAL_LEN);
+               if (!bcm_static_buf) {
+                       printk(KERN_ERR "can not alloc static buf!\n");
+               } else
+                       printk(KERN_ERR "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 /* defined(BRCM_FULLMAC) && defined(DHD_USE_STATIC_BUF) */
+
+#if defined(BCMDBG) && !defined(BRCM_FULLMAC)
        if (pkttag) {
                struct sk_buff *skb;
                ASSERT(OSL_PKTTAG_SZ <= sizeof(skb->cb));
@@ -171,6 +221,13 @@ void osl_detach(osl_t *osh)
        if (osh == NULL)
                return;
 
+#if defined(BRCM_FULLMAC) && defined(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);
 }
@@ -225,7 +282,74 @@ void BCMFASTPATH osl_pktfree(osl_t *osh, void *p, bool send)
        }
 }
 
-uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size)
+#if defined(BRCM_FULLMAC) && defined(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(KERN_ERR "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(KERN_ERR "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 /* defined(BRCM_FULLMAC) && defined(DHD_USE_STATIC_BUF) */
+
+u32 osl_pci_read_config(osl_t *osh, uint offset, uint size)
 {
        uint val = 0;
        uint retry = PCI_CFG_RETRY;
@@ -267,7 +391,7 @@ void osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val)
                        break;
        } while (retry--);
 
-#ifdef BCMDBG
+#if defined(BCMDBG) && !defined(BRCM_FULLMAC)
        if (retry < PCI_CFG_RETRY)
                printk("PCI CONFIG WRITE access to %d required %d retries\n",
                       offset, (PCI_CFG_RETRY - retry));
@@ -290,21 +414,6 @@ uint osl_pci_slot(osl_t *osh)
        return PCI_SLOT(((struct pci_dev *)osh->pdev)->devfn);
 }
 
-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;
@@ -313,6 +422,35 @@ void *osl_malloc(osl_t *osh, uint size)
        if (osh)
                ASSERT(osh->magic == OS_HANDLE_MAGIC);
 
+#if defined(BRCM_FULLMAC) && defined(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(KERN_ERR "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 /* defined(BRCM_FULLMAC) && defined(DHD_USE_STATIC_BUF) */
+
        addr = kmalloc(size, GFP_ATOMIC);
        if (addr == NULL) {
                if (osh)
@@ -327,6 +465,28 @@ void *osl_malloc(osl_t *osh, uint size)
 
 void osl_mfree(osl_t *osh, void *addr, uint size)
 {
+#if defined(BRCM_FULLMAC) && defined(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 /* defined(BRCM_FULLMAC) && defined(DHD_USE_STATIC_BUF) */
        if (osh) {
                ASSERT(osh->magic == OS_HANDLE_MAGIC);
                osh->malloced -= size;
@@ -340,27 +500,22 @@ uint osl_malloced(osl_t *osh)
        return 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,
+void *osl_dma_alloc_consistent(osl_t *osh, uint size, u16 align_bits,
                               uint *alloced, unsigned long *pap)
 {
-       uint16 align = (1 << align_bits);
        ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, align))
-               size += align;
-       *alloced = size;
-
+       if (align_bits) {
+               u16 align = (1 << align_bits);
+               if (!IS_ALIGNED(DMA_CONSISTENT_ALIGN, align))
+                       size += align;
+               *alloced = size;
+       }
        return pci_alloc_consistent(osh->pdev, size, (dma_addr_t *) pap);
 }
 
@@ -386,7 +541,7 @@ void BCMFASTPATH osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction)
 
        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);
+       pci_unmap_single(osh->pdev, (u32) pa, size, dir);
 }
 
 #if defined(BCMDBG_ASSERT)
@@ -411,22 +566,22 @@ void osl_assert(char *exp, char *file, int line)
        /* Print assert message and give it time to be written to /var/log/messages */
        if (!in_interrupt()) {
                const int delay = 3;
-               printk("%s", tempbuf);
-               printk("panic in %d seconds\n", delay);
+               printk(KERN_ERR "%s", tempbuf);
+               printk(KERN_ERR "panic in %d seconds\n", delay);
                set_current_state(TASK_INTERRUPTIBLE);
                schedule_timeout(delay * HZ);
        }
 
        switch (g_assert_type) {
        case 0:
-               panic("%s", tempbuf);
+               panic(KERN_ERR "%s", tempbuf);
                break;
        case 1:
-               printk("%s", tempbuf);
+               printk(KERN_ERR "%s", tempbuf);
                BUG();
                break;
        case 2:
-               printk("%s", tempbuf);
+               printk(KERN_ERR "%s", tempbuf);
                break;
        default:
                break;
@@ -436,38 +591,7 @@ void osl_assert(char *exp, char *file, int line)
 }
 #endif                         /* defined(BCMDBG_ASSERT) */
 
-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;
-
-       p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC);
-       if (p == NULL)
-               return NULL;
-
-       /* 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 */
-       osh->pub.pktalloced++;
-       return p;
-}
-
-#ifdef BCMSDIO
+#if defined(BCMSDIO) && !defined(BRCM_FULLMAC)
 u8 osl_readb(osl_t *osh, volatile u8 *r)
 {
        osl_rreg_fn_t rreg = ((osl_pubinfo_t *) osh)->rreg_fn;
@@ -476,20 +600,20 @@ u8 osl_readb(osl_t *osh, volatile u8 *r)
        return (u8) ((rreg) (ctx, (void *)r, sizeof(u8)));
 }
 
-uint16 osl_readw(osl_t *osh, volatile uint16 *r)
+u16 osl_readw(osl_t *osh, volatile u16 *r)
 {
        osl_rreg_fn_t rreg = ((osl_pubinfo_t *) osh)->rreg_fn;
        void *ctx = ((osl_pubinfo_t *) osh)->reg_ctx;
 
-       return (uint16) ((rreg) (ctx, (void *)r, sizeof(uint16)));
+       return (u16) ((rreg) (ctx, (void *)r, sizeof(u16)));
 }
 
-uint32 osl_readl(osl_t *osh, volatile uint32 *r)
+u32 osl_readl(osl_t *osh, volatile u32 *r)
 {
        osl_rreg_fn_t rreg = ((osl_pubinfo_t *) osh)->rreg_fn;
        void *ctx = ((osl_pubinfo_t *) osh)->reg_ctx;
 
-       return (uint32) ((rreg) (ctx, (void *)r, sizeof(uint32)));
+       return (u32) ((rreg) (ctx, (void *)r, sizeof(u32)));
 }
 
 void osl_writeb(osl_t *osh, volatile u8 *r, u8 v)
@@ -500,20 +624,19 @@ void osl_writeb(osl_t *osh, volatile u8 *r, u8 v)
        ((wreg) (ctx, (void *)r, v, sizeof(u8)));
 }
 
-void osl_writew(osl_t *osh, volatile uint16 *r, uint16 v)
+void osl_writew(osl_t *osh, volatile u16 *r, u16 v)
 {
        osl_wreg_fn_t wreg = ((osl_pubinfo_t *) osh)->wreg_fn;
        void *ctx = ((osl_pubinfo_t *) osh)->reg_ctx;
 
-       ((wreg) (ctx, (void *)r, v, sizeof(uint16)));
+       ((wreg) (ctx, (void *)r, v, sizeof(u16)));
 }
 
-void osl_writel(osl_t *osh, volatile uint32 *r, uint32 v)
+void osl_writel(osl_t *osh, volatile u32 *r, u32 v)
 {
        osl_wreg_fn_t wreg = ((osl_pubinfo_t *) osh)->wreg_fn;
        void *ctx = ((osl_pubinfo_t *) osh)->reg_ctx;
 
-       ((wreg) (ctx, (void *)r, v, sizeof(uint32)));
+       ((wreg) (ctx, (void *)r, v, sizeof(u32)));
 }
-#endif                         /* BCMSDIO */
-/* Linux Kernel: File Operations: end */
+#endif /* BCMSDIO */