2 * Linux OS Independent Layer
4 * Copyright (C) 1999-2011, Broadcom Corporation
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:
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.
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.
24 * $Id: linux_osl.h 301794 2011-12-08 20:41:35Z $
34 extern void * osl_os_open_image(char * filename);
35 extern int osl_os_get_image_block(char * buf, int len, void * image);
36 extern void osl_os_close_image(void * image);
42 extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag);
43 extern void osl_detach(osl_t *osh);
46 extern uint32 g_assert_type;
49 #if defined(BCMASSERT_LOG)
51 do { if (!(exp)) osl_assert(#exp, __FILE__, __LINE__); } while (0)
52 extern void osl_assert(char *exp, char *file, int line);
56 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
57 #if GCC_VERSION > 30100
58 #define ASSERT(exp) do {} while (0)
67 #define OSL_DELAY(usec) osl_delay(usec)
68 extern void osl_delay(uint usec);
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))
74 extern void osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size);
75 extern void osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size);
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))
82 extern uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size);
83 extern void osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val);
86 #define OSL_PCI_BUS(osh) osl_pci_bus(osh)
87 #define OSL_PCI_SLOT(osh) osl_pci_slot(osh)
88 extern uint osl_pci_bus(osl_t *osh);
89 extern uint osl_pci_slot(osl_t *osh);
96 pktfree_cb_fn_t tx_fn;
100 #define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
102 ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \
103 ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \
108 #define BUS_SWAP32(v) (v)
110 #define MALLOC(osh, size) osl_malloc((osh), (size))
111 #define MFREE(osh, addr, size) osl_mfree((osh), (addr), (size))
112 #define MALLOCED(osh) osl_malloced((osh))
113 extern void *osl_malloc(osl_t *osh, uint size);
114 extern void osl_mfree(osl_t *osh, void *addr, uint size);
115 extern uint osl_malloced(osl_t *osh);
117 #define NATIVE_MALLOC(osh, size) kmalloc(size, GFP_ATOMIC)
118 #define NATIVE_MFREE(osh, addr, size) kfree(addr)
120 #define MALLOC_FAILED(osh) osl_malloc_failed((osh))
121 extern uint osl_malloc_failed(osl_t *osh);
124 #define DMA_CONSISTENT_ALIGN osl_dma_consistent_align()
125 #define DMA_ALLOC_CONSISTENT(osh, size, align, tot, pap, dmah) \
126 osl_dma_alloc_consistent((osh), (size), (align), (tot), (pap))
127 #define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
128 osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
129 extern uint osl_dma_consistent_align(void);
130 extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align, uint *tot, ulong *pap);
131 extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa);
138 #define DMA_MAP(osh, va, size, direction, p, dmah) \
139 osl_dma_map((osh), (va), (size), (direction))
140 #define DMA_UNMAP(osh, pa, size, direction, p, dmah) \
141 osl_dma_unmap((osh), (pa), (size), (direction))
142 extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction);
143 extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction);
146 #define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
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))))
153 #define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \
155 #define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \
158 #define OSL_ERROR(bcmerror) osl_error(bcmerror)
159 extern int osl_error(int bcmerror);
162 #define PKTBUFSZ 2048
166 #define OSL_SYSUPTIME() ((uint32)jiffies_to_msecs(jiffies))
167 #define printf(fmt, args...) printk(fmt , ## args)
168 #include <linux/kernel.h>
169 #include <linux/string.h>
171 #define bcopy(src, dst, len) memcpy((dst), (src), (len))
172 #define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
173 #define bzero(b, len) memset((b), '\0', (len))
178 #define R_REG(osh, r) (\
179 SELECT_BUS_READ(osh, sizeof(*(r)) == sizeof(uint8) ? readb((volatile uint8*)(r)) : \
180 sizeof(*(r)) == sizeof(uint16) ? readw((volatile uint16*)(r)) : \
181 readl((volatile uint32*)(r)), OSL_READ_REG(osh, r)) \
184 #define R_REG(osh, r) (\
185 SELECT_BUS_READ(osh, \
187 __typeof(*(r)) __osl_v; \
188 __asm__ __volatile__("sync"); \
189 switch (sizeof(*(r))) { \
190 case sizeof(uint8): __osl_v = \
191 readb((volatile uint8*)(r)); break; \
192 case sizeof(uint16): __osl_v = \
193 readw((volatile uint16*)(r)); break; \
194 case sizeof(uint32): __osl_v = \
195 readl((volatile uint32*)(r)); break; \
197 __asm__ __volatile__("sync"); \
201 __typeof(*(r)) __osl_v; \
202 __asm__ __volatile__("sync"); \
203 __osl_v = OSL_READ_REG(osh, r); \
204 __asm__ __volatile__("sync"); \
210 #define W_REG(osh, r, v) do { \
211 SELECT_BUS_WRITE(osh, \
212 switch (sizeof(*(r))) { \
213 case sizeof(uint8): writeb((uint8)(v), (volatile uint8*)(r)); break; \
214 case sizeof(uint16): writew((uint16)(v), (volatile uint16*)(r)); break; \
215 case sizeof(uint32): writel((uint32)(v), (volatile uint32*)(r)); break; \
217 (OSL_WRITE_REG(osh, r, v))); \
221 #define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
222 #define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
225 #define bcopy(src, dst, len) memcpy((dst), (src), (len))
226 #define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
227 #define bzero(b, len) memset((b), '\0', (len))
231 #include <asm/addrspace.h>
232 #define OSL_UNCACHED(va) ((void *)KSEG1ADDR((va)))
233 #define OSL_CACHED(va) ((void *)KSEG0ADDR((va)))
235 #define OSL_UNCACHED(va) ((void *)va)
236 #define OSL_CACHED(va) ((void *)va)
240 #if defined(__i386__)
241 #define OSL_GETCYCLES(x) rdtscl((x))
243 #define OSL_GETCYCLES(x) ((x) = 0)
247 #define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; })
250 #if !defined(CONFIG_MMC_MSM7X00A)
251 #define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
253 #define REG_MAP(pa, size) (void *)(0)
255 #define REG_UNMAP(va) iounmap((va))
259 #define W_SM(r, v) (*(r) = (v))
260 #define BZERO_SM(r, len) memset((r), '\0', (len))
263 #include <linuxver.h>
266 #define PKTGET(osh, len, send) osl_pktget((osh), (len))
267 #define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
268 #define PKTLIST_DUMP(osh, buf)
269 #define PKTDBG_TRACE(osh, pkt, bit)
270 #define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
271 #ifdef CONFIG_DHD_USE_STATIC_BUF
272 #define PKTGET_STATIC(osh, len, send) osl_pktget_static((osh), (len))
273 #define PKTFREE_STATIC(osh, skb, send) osl_pktfree_static((osh), (skb), (send))
275 #define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data)
276 #define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len)
277 #define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
278 #define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail))
279 #define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next)
280 #define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x))
281 #define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len))
282 #define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes))
283 #define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes))
284 #define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb))
285 #define PKTALLOCED(osh) ((osl_pubinfo_t *)(osh))->pktalloced
286 #define PKTSETPOOL(osh, skb, x, y) do {} while (0)
287 #define PKTPOOL(osh, skb) FALSE
288 #define PKTSHRINK(osh, m) (m)
291 #define CTFPOOL_REFILL_THRESH 3
292 typedef struct ctfpool {
303 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
304 #define FASTBUF (1 << 4)
305 #define CTFBUF (1 << 5)
306 #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= FASTBUF)
307 #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~FASTBUF))
308 #define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= CTFBUF)
309 #define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~CTFBUF))
310 #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & FASTBUF)
311 #define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & CTFBUF)
312 #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->mac_len)
314 #define FASTBUF (1 << 0)
315 #define CTFBUF (1 << 1)
316 #define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= FASTBUF)
317 #define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~FASTBUF))
318 #define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= CTFBUF)
319 #define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~CTFBUF))
320 #define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) & FASTBUF)
321 #define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) & CTFBUF)
322 #define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->__unused)
325 #define CTFPOOLPTR(osh, skb) (((struct sk_buff*)(skb))->sk)
326 #define CTFPOOLHEAD(osh, skb) (((ctfpool_t *)((struct sk_buff*)(skb))->sk)->head)
328 extern void *osl_ctfpool_add(osl_t *osh);
329 extern void osl_ctfpool_replenish(osl_t *osh, uint thresh);
330 extern int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size);
331 extern void osl_ctfpool_cleanup(osl_t *osh);
332 extern void osl_ctfpool_stats(osl_t *osh, void *b);
336 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
337 #define SKIPCT (1 << 6)
338 #define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len |= SKIPCT)
339 #define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len &= (~SKIPCT))
340 #define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len & SKIPCT)
342 #define SKIPCT (1 << 2)
343 #define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused |= SKIPCT)
344 #define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused &= (~SKIPCT))
345 #define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused & SKIPCT)
348 #define PKTSETSKIPCT(osh, skb)
349 #define PKTCLRSKIPCT(osh, skb)
350 #define PKTSKIPCT(osh, skb)
353 extern void osl_pktfree(osl_t *osh, void *skb, bool send);
354 extern void *osl_pktget_static(osl_t *osh, uint len);
355 extern void osl_pktfree_static(osl_t *osh, void *skb, bool send);
357 extern void *osl_pktget(osl_t *osh, uint len);
358 extern void *osl_pktdup(osl_t *osh, void *skb);
362 osl_pkt_frmnative(osl_pubinfo_t *osh, void *pkt)
364 struct sk_buff *nskb;
367 bzero((void*)((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
370 for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
376 #define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t *)osh), (struct sk_buff*)(skb))
379 static INLINE struct sk_buff *
380 osl_pkt_tonative(osl_pubinfo_t *osh, void *pkt)
382 struct sk_buff *nskb;
385 bzero(((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
388 for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
392 return (struct sk_buff *)pkt;
394 #define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_pubinfo_t *)(osh), (pkt))
396 #define PKTLINK(skb) (((struct sk_buff*)(skb))->prev)
397 #define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
398 #define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority)
399 #define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x))
400 #define PKTSUMNEEDED(skb) (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
401 #define PKTSETSUMGOOD(skb, x) (((struct sk_buff*)(skb))->ip_summed = \
402 ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
404 #define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned)
412 #define ASSERT(exp) do {} while (0)
415 #define MALLOC(o, l) malloc(l)
416 #define MFREE(o, p, l) free(p)
426 extern void bcopy(const void *src, void *dst, size_t len);
427 extern int bcmp(const void *b1, const void *b2, size_t len);
428 extern void bzero(void *b, size_t len);