Root/package/broadcom-wl/src/driver/linux_osl.h

1/*
2 * Linux OS Independent Layer
3 *
4 * Copyright 2007, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
11 *
12 */
13
14#ifndef _linux_osl_h_
15#define _linux_osl_h_
16
17#include <typedefs.h>
18#include <linuxver.h>
19#include <osl.h>
20
21#define OSL_PKTTAG_SZ 32 /* Size of PktTag */
22
23/* microsecond delay */
24extern void osl_delay(uint usec);
25
26/* OSL initialization */
27extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag);
28extern void osl_detach(osl_t *osh);
29
30#define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
31    do { \
32       ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \
33       ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \
34    } while (0)
35
36/* host/bus architecture-specific byte swap */
37#define BUS_SWAP32(v) (v)
38
39
40#define MALLOC_FAILED(osh) osl_malloc_failed((osh))
41
42extern void *osl_malloc(osl_t *osh, uint size);
43extern void osl_mfree(osl_t *osh, void *addr, uint size);
44extern uint osl_malloced(osl_t *osh);
45extern uint osl_malloc_failed(osl_t *osh);
46
47/* allocate/free shared (dma-able) consistent memory */
48#define DMA_CONSISTENT_ALIGN PAGE_SIZE
49#define DMA_ALLOC_CONSISTENT(osh, size, pap, dmah) \
50    osl_dma_alloc_consistent((osh), (size), (pap))
51#define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
52    osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
53extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap);
54extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa);
55
56/* map/unmap direction */
57#define DMA_TX 1 /* TX direction for DMA */
58#define DMA_RX 2 /* RX direction for DMA */
59
60/* map/unmap shared (dma-able) memory */
61#define DMA_MAP(osh, va, size, direction, p, dmah) \
62    osl_dma_map((osh), (va), (size), (direction))
63#define DMA_UNMAP(osh, pa, size, direction, p, dmah) \
64    osl_dma_unmap((osh), (pa), (size), (direction))
65extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction);
66extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction);
67
68/* API for DMA addressing capability */
69#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
70
71/* register access macros */
72#if defined(BCMJTAG)
73#include <bcmjtag.h>
74#define OSL_WRITE_REG(osh, r, v) (bcmjtag_write(NULL, (uintptr)(r), (v), sizeof(*(r))))
75#define OSL_READ_REG(osh, r) (bcmjtag_read(NULL, (uintptr)(r), sizeof(*(r))))
76#endif
77
78#if defined(BCMJTAG)
79#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \
80    mmap_op else bus_op
81#define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \
82    mmap_op : bus_op
83#else
84#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) mmap_op
85#define SELECT_BUS_READ(osh, mmap_op, bus_op) mmap_op
86#endif
87
88/*
89 * BINOSL selects the slightly slower function-call-based binary compatible osl.
90 * Macros expand to calls to functions defined in linux_osl.c .
91 */
92#ifndef BINOSL
93
94/* string library, kernel mode */
95#ifndef printf
96#define printf(fmt, args...) printk(fmt, ## args)
97#endif /* printf */
98#include <linux/kernel.h>
99#include <linux/string.h>
100
101/* register access macros */
102#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
103#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
104
105/* bcopy, bcmp, and bzero */
106#define bcopy(src, dst, len) memcpy((dst), (src), (len))
107#define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
108#define bzero(b, len) memset((b), '\0', (len))
109
110/* uncached virtual address */
111#ifdef mips
112#define OSL_UNCACHED(va) KSEG1ADDR((va))
113#include <asm/addrspace.h>
114#else
115#define OSL_UNCACHED(va) (va)
116#endif /* mips */
117
118/* get processor cycle count */
119#if defined(mips)
120#define OSL_GETCYCLES(x) ((x) = read_c0_count() * 2)
121#elif defined(__i386__)
122#define OSL_GETCYCLES(x) rdtscl((x))
123#else
124#define OSL_GETCYCLES(x) ((x) = 0)
125#endif /* defined(mips) */
126
127/* dereference an address that may cause a bus exception */
128#ifdef mips
129#if defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17))
130#define BUSPROBE(val, addr) panic("get_dbe() will not fixup a bus exception when compiled into"\
131                    " a module")
132#else
133#define BUSPROBE(val, addr) get_dbe((val), (addr))
134#include <asm/paccess.h>
135#endif /* defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17)) */
136#else
137#define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; })
138#endif /* mips */
139
140/* map/unmap physical to virtual I/O */
141#define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
142#define REG_UNMAP(va) iounmap((void *)(va))
143
144/* shared (dma-able) memory access macros */
145#define R_SM(r) *(r)
146#define W_SM(r, v) (*(r) = (v))
147#define BZERO_SM(r, len) memset((r), '\0', (len))
148
149/* packet primitives */
150#define PKTGET(osh, len, send) osl_pktget((osh), (len))
151#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
152#define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data)
153#define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len)
154#define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
155#define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail))
156#define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next)
157#define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x))
158#define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len))
159#define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes))
160#define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes))
161#define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
162#define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb))
163#define PKTALLOCED(osh) ((osl_pubinfo_t *)(osh))->pktalloced
164#ifdef BCMDBG_PKT /* pkt logging for debugging */
165#define PKTLIST_DUMP(osh, buf) osl_pktlist_dump(osh, buf)
166#else /* BCMDBG_PKT */
167#define PKTLIST_DUMP(osh, buf)
168#endif /* BCMDBG_PKT */
169
170#ifdef BCMDBG_PKT /* pkt logging for debugging */
171extern void osl_pktlist_add(osl_t *osh, void *p);
172extern void osl_pktlist_remove(osl_t *osh, void *p);
173extern char *osl_pktlist_dump(osl_t *osh, char *buf);
174#endif /* BCMDBG_PKT */
175
176/* Convert a native(OS) packet to driver packet.
177 * In the process, native packet is destroyed, there is no copying
178 * Also, a packettag is zeroed out
179 */
180static INLINE void *
181osl_pkt_frmnative(osl_pubinfo_t *osh, struct sk_buff *skb)
182{
183    struct sk_buff *nskb;
184
185    if (osh->pkttag)
186        bzero((void*)skb->cb, OSL_PKTTAG_SZ);
187
188    /* Increment the packet counter */
189    for (nskb = skb; nskb; nskb = nskb->next) {
190#ifdef BCMDBG_PKT
191        osl_pktlist_add((osl_t *)osh, (void *) nskb);
192#endif /* BCMDBG_PKT */
193        osh->pktalloced++;
194    }
195
196    return (void *)skb;
197}
198#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t *)osh), (struct sk_buff*)(skb))
199
200/* Convert a driver packet to native(OS) packet
201 * In the process, packettag is zeroed out before sending up
202 * IP code depends on skb->cb to be setup correctly with various options
203 * In our case, that means it should be 0
204 */
205static INLINE struct sk_buff *
206osl_pkt_tonative(osl_pubinfo_t *osh, void *pkt)
207{
208    struct sk_buff *nskb;
209
210    if (osh->pkttag)
211        bzero(((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
212
213    /* Decrement the packet counter */
214    for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
215#ifdef BCMDBG_PKT
216        osl_pktlist_remove((osl_t *)osh, (void *) nskb);
217#endif /* BCMDBG_PKT */
218        osh->pktalloced--;
219    }
220
221    return (struct sk_buff *)pkt;
222}
223#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_pubinfo_t *)(osh), (pkt))
224
225#define PKTLINK(skb) (((struct sk_buff*)(skb))->prev)
226#define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
227#define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority)
228#define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x))
229#define PKTSUMNEEDED(skb) (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
230#define PKTSETSUMGOOD(skb, x) (((struct sk_buff*)(skb))->ip_summed = \
231                        ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
232/* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
233#define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned)
234
235extern void *osl_pktget(osl_t *osh, uint len);
236extern void osl_pktfree(osl_t *osh, void *skb, bool send);
237extern void *osl_pktdup(osl_t *osh, void *skb);
238#else /* BINOSL */
239
240/* string library */
241#ifndef LINUX_OSL
242#undef printf
243#define printf(fmt, args...) osl_printf((fmt), ## args)
244#undef sprintf
245#define sprintf(buf, fmt, args...) osl_sprintf((buf), (fmt), ## args)
246#undef strcmp
247#define strcmp(s1, s2) osl_strcmp((s1), (s2))
248#undef strncmp
249#define strncmp(s1, s2, n) osl_strncmp((s1), (s2), (n))
250#undef strlen
251#define strlen(s) osl_strlen((s))
252#undef strcpy
253#define strcpy(d, s) osl_strcpy((d), (s))
254#undef strncpy
255#define strncpy(d, s, n) osl_strncpy((d), (s), (n))
256#endif /* LINUX_OSL */
257extern int osl_printf(const char *format, ...);
258extern int osl_sprintf(char *buf, const char *format, ...);
259extern int osl_strcmp(const char *s1, const char *s2);
260extern int osl_strncmp(const char *s1, const char *s2, uint n);
261extern int osl_strlen(const char *s);
262extern char* osl_strcpy(char *d, const char *s);
263extern char* osl_strncpy(char *d, const char *s, uint n);
264
265/* register access macros */
266#if !defined(BCMJTAG)
267#define R_REG(osh, r) (\
268    sizeof(*(r)) == sizeof(uint8) ? osl_readb((volatile uint8*)(r)) : \
269    sizeof(*(r)) == sizeof(uint16) ? osl_readw((volatile uint16*)(r)) : \
270    osl_readl((volatile uint32*)(r)) \
271)
272#define W_REG(osh, r, v) do { \
273    switch (sizeof(*(r))) { \
274    case sizeof(uint8): osl_writeb((uint8)(v), (volatile uint8*)(r)); break; \
275    case sizeof(uint16): osl_writew((uint16)(v), (volatile uint16*)(r)); break; \
276    case sizeof(uint32): osl_writel((uint32)(v), (volatile uint32*)(r)); break; \
277    } \
278} while (0)
279#endif
280
281#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
282#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
283extern uint8 osl_readb(volatile uint8 *r);
284extern uint16 osl_readw(volatile uint16 *r);
285extern uint32 osl_readl(volatile uint32 *r);
286extern void osl_writeb(uint8 v, volatile uint8 *r);
287extern void osl_writew(uint16 v, volatile uint16 *r);
288extern void osl_writel(uint32 v, volatile uint32 *r);
289
290/* bcopy, bcmp, and bzero */
291extern void bcopy(const void *src, void *dst, int len);
292extern int bcmp(const void *b1, const void *b2, int len);
293extern void bzero(void *b, int len);
294
295/* uncached virtual address */
296#define OSL_UNCACHED(va) osl_uncached((va))
297extern void *osl_uncached(void *va);
298
299/* get processor cycle count */
300#define OSL_GETCYCLES(x) ((x) = osl_getcycles())
301extern uint osl_getcycles(void);
302
303/* dereference an address that may target abort */
304#define BUSPROBE(val, addr) osl_busprobe(&(val), (addr))
305extern int osl_busprobe(uint32 *val, uint32 addr);
306
307/* map/unmap physical to virtual */
308#define REG_MAP(pa, size) osl_reg_map((pa), (size))
309#define REG_UNMAP(va) osl_reg_unmap((va))
310extern void *osl_reg_map(uint32 pa, uint size);
311extern void osl_reg_unmap(void *va);
312
313/* shared (dma-able) memory access macros */
314#define R_SM(r) *(r)
315#define W_SM(r, v) (*(r) = (v))
316#define BZERO_SM(r, len) bzero((r), (len))
317
318/* packet primitives */
319#define PKTGET(osh, len, send) osl_pktget((osh), (len))
320#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send))
321#define PKTDATA(osh, skb) osl_pktdata((osh), (skb))
322#define PKTLEN(osh, skb) osl_pktlen((osh), (skb))
323#define PKTHEADROOM(osh, skb) osl_pktheadroom((osh), (skb))
324#define PKTTAILROOM(osh, skb) osl_pkttailroom((osh), (skb))
325#define PKTNEXT(osh, skb) osl_pktnext((osh), (skb))
326#define PKTSETNEXT(osh, skb, x) osl_pktsetnext((skb), (x))
327#define PKTSETLEN(osh, skb, len) osl_pktsetlen((osh), (skb), (len))
328#define PKTPUSH(osh, skb, bytes) osl_pktpush((osh), (skb), (bytes))
329#define PKTPULL(osh, skb, bytes) osl_pktpull((osh), (skb), (bytes))
330#define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
331#define PKTTAG(skb) osl_pkttag((skb))
332#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative((osh), (struct sk_buff*)(skb))
333#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osh), (pkt))
334#define PKTLINK(skb) osl_pktlink((skb))
335#define PKTSETLINK(skb, x) osl_pktsetlink((skb), (x))
336#define PKTPRIO(skb) osl_pktprio((skb))
337#define PKTSETPRIO(skb, x) osl_pktsetprio((skb), (x))
338#define PKTSHARED(skb) osl_pktshared((skb))
339#define PKTALLOCED(osh) osl_pktalloced((osh))
340#ifdef BCMDBG_PKT
341#define PKTLIST_DUMP(osh, buf) osl_pktlist_dump(osh, buf)
342#else /* BCMDBG_PKT */
343#define PKTLIST_DUMP(osh, buf)
344#endif /* BCMDBG_PKT */
345
346extern void *osl_pktget(osl_t *osh, uint len);
347extern void osl_pktfree(osl_t *osh, void *skb, bool send);
348extern uchar *osl_pktdata(osl_t *osh, void *skb);
349extern uint osl_pktlen(osl_t *osh, void *skb);
350extern uint osl_pktheadroom(osl_t *osh, void *skb);
351extern uint osl_pkttailroom(osl_t *osh, void *skb);
352extern void *osl_pktnext(osl_t *osh, void *skb);
353extern void osl_pktsetnext(void *skb, void *x);
354extern void osl_pktsetlen(osl_t *osh, void *skb, uint len);
355extern uchar *osl_pktpush(osl_t *osh, void *skb, int bytes);
356extern uchar *osl_pktpull(osl_t *osh, void *skb, int bytes);
357extern void *osl_pktdup(osl_t *osh, void *skb);
358extern void *osl_pkttag(void *skb);
359extern void *osl_pktlink(void *skb);
360extern void osl_pktsetlink(void *skb, void *x);
361extern uint osl_pktprio(void *skb);
362extern void osl_pktsetprio(void *skb, uint x);
363extern void *osl_pkt_frmnative(osl_t *osh, struct sk_buff *skb);
364extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt);
365extern bool osl_pktshared(void *skb);
366extern uint osl_pktalloced(osl_t *osh);
367
368#ifdef BCMDBG_PKT /* pkt logging for debugging */
369extern char *osl_pktlist_dump(osl_t *osh, char *buf);
370extern void osl_pktlist_add(osl_t *osh, void *p);
371extern void osl_pktlist_remove(osl_t *osh, void *p);
372#endif /* BCMDBG_PKT */
373
374#endif /* BINOSL */
375
376#define OSL_ERROR(bcmerror) osl_error(bcmerror)
377extern int osl_error(int bcmerror);
378
379/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
380#define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */
381
382#endif /* _linux_osl_h_ */
383

Archive Download this file



interactive