1/* 2 * Linux OS Independent Layer 3 * 4 * Copyright (C) 1999-2012, Broadcom Corporation 5 * 6 * Unless you and Broadcom execute a separate written software license 7 * agreement governing use of this software, this software is licensed to you 8 * under the terms of the GNU General Public License version 2 (the "GPL"), 9 * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10 * following added to such license: 11 * 12 * As a special exception, the copyright holders of this software give you 13 * permission to link this software with independent modules, and to copy and 14 * distribute the resulting executable under terms of your choice, provided that 15 * you also meet, for each linked independent module, the terms and conditions of 16 * the license of that module. An independent module is a module which is not 17 * derived from this software. The special exception does not apply to any 18 * modifications of the software. 19 * 20 * Notwithstanding the above, under no circumstances may you combine this 21 * software in any way with any other Broadcom software provided under a license 22 * other than the GPL, without Broadcom's express prior written consent. 23 * 24 * $Id: linux_osl.h 309193 2012-01-19 00:03:57Z $ 25 */ 26 27#ifndef _linux_osl_h_ 28#define _linux_osl_h_ 29 30#include <typedefs.h> 31 32 33extern void * osl_os_open_image(char * filename); 34extern int osl_os_get_image_block(char * buf, int len, void * image); 35extern void osl_os_close_image(void * image); 36extern int osl_os_image_size(void *image); 37 38 39#ifdef BCMDRIVER 40 41 42extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag); 43extern void osl_detach(osl_t *osh); 44 45 46extern uint32 g_assert_type; 47 48 49#if defined(BCMASSERT_LOG) 50 #define ASSERT(exp) \ 51 do { if (!(exp)) osl_assert(#exp, __FILE__, __LINE__); } while (0) 52extern void osl_assert(const char *exp, const char *file, int line); 53#else 54 #ifdef __GNUC__ 55 #define GCC_VERSION \ 56 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) 57 #if GCC_VERSION > 30100 58 #define ASSERT(exp) do {} while (0) 59 #else 60 61 #define ASSERT(exp) 62 #endif 63 #endif 64#endif 65 66 67#define OSL_DELAY(usec) osl_delay(usec) 68extern void osl_delay(uint usec); 69 70#define OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \ 71 osl_pcmcia_read_attr((osh), (offset), (buf), (size)) 72#define OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \ 73 osl_pcmcia_write_attr((osh), (offset), (buf), (size)) 74extern void osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size); 75extern void osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size); 76 77 78#define OSL_PCI_READ_CONFIG(osh, offset, size) \ 79 osl_pci_read_config((osh), (offset), (size)) 80#define OSL_PCI_WRITE_CONFIG(osh, offset, size, val) \ 81 osl_pci_write_config((osh), (offset), (size), (val)) 82extern uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size); 83extern void osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val); 84 85 86#define OSL_PCI_BUS(osh) osl_pci_bus(osh) 87#define OSL_PCI_SLOT(osh) osl_pci_slot(osh) 88extern uint osl_pci_bus(osl_t *osh); 89extern uint osl_pci_slot(osl_t *osh); 90extern struct pci_dev *osl_pci_device(osl_t *osh); 91 92 93typedef struct { 94 bool pkttag; 95 uint pktalloced; 96 bool mmbus; 97 pktfree_cb_fn_t tx_fn; 98 void *tx_ctx; 99 void *unused[3]; 100} osl_pubinfo_t; 101 102#define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \ 103 do { \ 104 ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \ 105 ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \ 106 } while (0) 107 108 109 110#define BUS_SWAP32(v) (v) 111 112 #define MALLOC(osh, size) osl_malloc((osh), (size)) 113 #define MFREE(osh, addr, size) osl_mfree((osh), (addr), (size)) 114 #define MALLOCED(osh) osl_malloced((osh)) 115 extern void *osl_malloc(osl_t *osh, uint size); 116 extern void osl_mfree(osl_t *osh, void *addr, uint size); 117 extern uint osl_malloced(osl_t *osh); 118 119#define NATIVE_MALLOC(osh, size) kmalloc(size, GFP_ATOMIC) 120#define NATIVE_MFREE(osh, addr, size) kfree(addr) 121 122#define MALLOC_FAILED(osh) osl_malloc_failed((osh)) 123extern uint osl_malloc_failed(osl_t *osh); 124 125 126#define DMA_CONSISTENT_ALIGN osl_dma_consistent_align() 127#define DMA_ALLOC_CONSISTENT(osh, size, align, tot, pap, dmah) \ 128 osl_dma_alloc_consistent((osh), (size), (align), (tot), (pap)) 129#define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \ 130 osl_dma_free_consistent((osh), (void*)(va), (size), (pa)) 131extern uint osl_dma_consistent_align(void); 132extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align, uint *tot, ulong *pap); 133extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa); 134 135 136#define DMA_TX 1 137#define DMA_RX 2 138 139 140#define DMA_UNMAP(osh, pa, size, direction, p, dmah) \ 141 osl_dma_unmap((osh), (pa), (size), (direction)) 142extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction); 143extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction); 144 145 146#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0) 147 148 149 #include <bcmsdh.h> 150 #define OSL_WRITE_REG(osh, r, v) (bcmsdh_reg_write(NULL, (uintptr)(r), sizeof(*(r)), (v))) 151 #define OSL_READ_REG(osh, r) (bcmsdh_reg_read(NULL, (uintptr)(r), sizeof(*(r)))) 152 153 #define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \ 154 mmap_op else bus_op 155 #define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \ 156 mmap_op : bus_op 157 158#define OSL_ERROR(bcmerror) osl_error(bcmerror) 159extern int osl_error(int bcmerror); 160 161 162#define PKTBUFSZ 2048 163 164 165#include <linuxver.h> 166#include <linux/kernel.h> 167#include <linux/string.h> 168 169#define OSL_SYSUPTIME() ((uint32)jiffies * (1000 / HZ)) 170#define printf(fmt, args...) printk(fmt , ## args) 171#include <linux/kernel.h> 172#include <linux/string.h> 173 174#define bcopy(src, dst, len) memcpy((dst), (src), (len)) 175#define bcmp(b1, b2, len) memcmp((b1), (b2), (len)) 176#define bzero(b, len) memset((b), '\0', (len)) 177 178 179 180#define R_REG(osh, r) (\ 181 SELECT_BUS_READ(osh, \ 182 ({ \ 183 __typeof(*(r)) __osl_v; \ 184 BCM_REFERENCE(osh); \ 185 switch (sizeof(*(r))) { \ 186 case sizeof(uint8): __osl_v = \ 187 readb((volatile uint8*)(r)); break; \ 188 case sizeof(uint16): __osl_v = \ 189 readw((volatile uint16*)(r)); break; \ 190 case sizeof(uint32): __osl_v = \ 191 readl((volatile uint32*)(r)); break; \ 192 } \ 193 __osl_v; \ 194 }), \ 195 OSL_READ_REG(osh, r)) \ 196) 197 198#define W_REG(osh, r, v) do { \ 199 BCM_REFERENCE(osh); \ 200 SELECT_BUS_WRITE(osh, \ 201 switch (sizeof(*(r))) { \ 202 case sizeof(uint8): writeb((uint8)(v), (volatile uint8*)(r)); break; \ 203 case sizeof(uint16): writew((uint16)(v), (volatile uint16*)(r)); break; \ 204 case sizeof(uint32): writel((uint32)(v), (volatile uint32*)(r)); break; \ 205 }, \ 206 (OSL_WRITE_REG(osh, r, v))); \ 207 } while (0) 208 209#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v)) 210#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v)) 211 212 213#define bcopy(src, dst, len) memcpy((dst), (src), (len)) 214#define bcmp(b1, b2, len) memcmp((b1), (b2), (len)) 215#define bzero(b, len) memset((b), '\0', (len)) 216 217 218#define OSL_UNCACHED(va) ((void *)va) 219#define OSL_CACHED(va) ((void *)va) 220 221#define OSL_PREF_RANGE_LD(va, sz) 222#define OSL_PREF_RANGE_ST(va, sz) 223 224 225#if defined(__i386__) 226#define OSL_GETCYCLES(x) rdtscl((x)) 227#else 228#define OSL_GETCYCLES(x) ((x) = 0) 229#endif 230 231 232#define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; }) 233 234 235#if !defined(CONFIG_MMC_MSM7X00A) 236#define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size)) 237#else 238#define REG_MAP(pa, size) (void *)(0) 239#endif 240#define REG_UNMAP(va) iounmap((va)) 241 242 243#define R_SM(r) *(r) 244#define W_SM(r, v) (*(r) = (v)) 245#define BZERO_SM(r, len) memset((r), '\0', (len)) 246 247 248#include <linuxver.h> 249 250 251#define PKTGET(osh, len, send) osl_pktget((osh), (len)) 252#define PKTDUP(osh, skb) osl_pktdup((osh), (skb)) 253#define PKTLIST_DUMP(osh, buf) 254#define PKTDBG_TRACE(osh, pkt, bit) 255#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send)) 256#ifdef CONFIG_DHD_USE_STATIC_BUF 257#define PKTGET_STATIC(osh, len, send) osl_pktget_static((osh), (len)) 258#define PKTFREE_STATIC(osh, skb, send) osl_pktfree_static((osh), (skb), (send)) 259#endif 260#define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data) 261#define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len) 262#define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head)) 263#define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail)) 264#define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next) 265#define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x)) 266#define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len)) 267#define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes)) 268#define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes)) 269#define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb)) 270#define PKTALLOCED(osh) ((osl_pubinfo_t *)(osh))->pktalloced 271#define PKTSETPOOL(osh, skb, x, y) do {} while (0) 272#define PKTPOOL(osh, skb) FALSE 273#define PKTSHRINK(osh, m) (m) 274 275#ifdef CTFPOOL 276#define CTFPOOL_REFILL_THRESH 3 277typedef struct ctfpool { 278 void *head; 279 spinlock_t lock; 280 uint max_obj; 281 uint curr_obj; 282 uint obj_size; 283 uint refills; 284 uint fast_allocs; 285 uint fast_frees; 286 uint slow_allocs; 287} ctfpool_t; 288#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) 289#define FASTBUF (1 << 4) 290#define CTFBUF (1 << 5) 291#define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= FASTBUF) 292#define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~FASTBUF)) 293#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= CTFBUF) 294#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~CTFBUF)) 295#define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & FASTBUF) 296#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & CTFBUF) 297#define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->mac_len) 298#else 299#define FASTBUF (1 << 0) 300#define CTFBUF (1 << 1) 301#define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= FASTBUF) 302#define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~FASTBUF)) 303#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= CTFBUF) 304#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~CTFBUF)) 305#define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) & FASTBUF) 306#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) & CTFBUF) 307#define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->__unused) 308#endif 309 310#define CTFPOOLPTR(osh, skb) (((struct sk_buff*)(skb))->sk) 311#define CTFPOOLHEAD(osh, skb) (((ctfpool_t *)((struct sk_buff*)(skb))->sk)->head) 312 313extern void *osl_ctfpool_add(osl_t *osh); 314extern void osl_ctfpool_replenish(osl_t *osh, uint thresh); 315extern int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size); 316extern void osl_ctfpool_cleanup(osl_t *osh); 317extern void osl_ctfpool_stats(osl_t *osh, void *b); 318#endif 319 320 321#ifdef HNDCTF 322#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) 323#define SKIPCT (1 << 6) 324#define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len |= SKIPCT) 325#define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len &= (~SKIPCT)) 326#define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len & SKIPCT) 327#else 328#define SKIPCT (1 << 2) 329#define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused |= SKIPCT) 330#define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused &= (~SKIPCT)) 331#define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused & SKIPCT) 332#endif 333#else 334#define PKTSETSKIPCT(osh, skb) 335#define PKTCLRSKIPCT(osh, skb) 336#define PKTSKIPCT(osh, skb) 337#endif 338 339extern void osl_pktfree(osl_t *osh, void *skb, bool send); 340extern void *osl_pktget_static(osl_t *osh, uint len); 341extern void osl_pktfree_static(osl_t *osh, void *skb, bool send); 342 343extern void *osl_pkt_frmnative(osl_t *osh, void *skb); 344extern void *osl_pktget(osl_t *osh, uint len); 345extern void *osl_pktdup(osl_t *osh, void *skb); 346extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt); 347#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_t *)osh), (struct sk_buff*)(skb)) 348#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_t *)(osh), (pkt)) 349 350#define PKTLINK(skb) (((struct sk_buff*)(skb))->prev) 351#define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x)) 352#define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority) 353#define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x)) 354#define PKTSUMNEEDED(skb) (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW) 355#define PKTSETSUMGOOD(skb, x) (((struct sk_buff*)(skb))->ip_summed = \ 356 ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE)) 357 358#define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned) 359 360#define DMA_MAP(osh, va, size, direction, p, dmah) \ 361 osl_dma_map((osh), (va), (size), (direction)) 362 363#else 364 365 366 367 #define ASSERT(exp) do {} while (0) 368 369 370#define MALLOC(o, l) malloc(l) 371#define MFREE(o, p, l) free(p) 372#include <stdlib.h> 373 374 375#include <string.h> 376 377 378#include <stdio.h> 379 380 381extern void bcopy(const void *src, void *dst, size_t len); 382extern int bcmp(const void *b1, const void *b2, size_t len); 383extern void bzero(void *b, size_t len); 384#endif 385 386#endif 387