2 * Linux OS Independent Layer
4 * Copyright 2007, Broadcom Corporation
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.
21 #define OSL_PKTTAG_SZ 32 /* Size of PktTag */
23 /* microsecond delay */
24 extern void osl_delay(uint usec
);
26 /* OSL initialization */
27 extern osl_t
*osl_attach(void *pdev
, uint bustype
, bool pkttag
);
28 extern void osl_detach(osl_t
*osh
);
30 #define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
32 ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \
33 ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \
36 /* host/bus architecture-specific byte swap */
37 #define BUS_SWAP32(v) (v)
40 #define MALLOC_FAILED(osh) osl_malloc_failed((osh))
42 extern void *osl_malloc(osl_t
*osh
, uint size
);
43 extern void osl_mfree(osl_t
*osh
, void *addr
, uint size
);
44 extern uint
osl_malloced(osl_t
*osh
);
45 extern uint
osl_malloc_failed(osl_t
*osh
);
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))
53 extern void *osl_dma_alloc_consistent(osl_t
*osh
, uint size
, ulong
*pap
);
54 extern void osl_dma_free_consistent(osl_t
*osh
, void *va
, uint size
, ulong pa
);
56 /* map/unmap direction */
57 #define DMA_TX 1 /* TX direction for DMA */
58 #define DMA_RX 2 /* RX direction for DMA */
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))
65 extern uint
osl_dma_map(osl_t
*osh
, void *va
, uint size
, int direction
);
66 extern void osl_dma_unmap(osl_t
*osh
, uint pa
, uint size
, int direction
);
68 /* API for DMA addressing capability */
69 #define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
71 /* register access macros */
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))))
79 #define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \
81 #define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \
84 #define SELECT_BUS_WRITE(osh, mmap_op, bus_op) mmap_op
85 #define SELECT_BUS_READ(osh, mmap_op, bus_op) mmap_op
89 * BINOSL selects the slightly slower function-call-based binary compatible osl.
90 * Macros expand to calls to functions defined in linux_osl.c .
94 /* string library, kernel mode */
96 #define printf(fmt, args...) printk(fmt, ## args)
98 #include <linux/kernel.h>
99 #include <linux/string.h>
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))
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))
110 /* uncached virtual address */
112 #define OSL_UNCACHED(va) KSEG1ADDR((va))
113 #include <asm/addrspace.h>
115 #define OSL_UNCACHED(va) (va)
118 /* get processor cycle count */
120 #define OSL_GETCYCLES(x) ((x) = read_c0_count() * 2)
121 #elif defined(__i386__)
122 #define OSL_GETCYCLES(x) rdtscl((x))
124 #define OSL_GETCYCLES(x) ((x) = 0)
125 #endif /* defined(mips) */
127 /* dereference an address that may cause a bus exception */
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"\
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)) */
137 #define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; })
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))
144 /* shared (dma-able) memory access macros */
146 #define W_SM(r, v) (*(r) = (v))
147 #define BZERO_SM(r, len) memset((r), '\0', (len))
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 */
170 #ifdef BCMDBG_PKT /* pkt logging for debugging */
171 extern void osl_pktlist_add(osl_t
*osh
, void *p
);
172 extern void osl_pktlist_remove(osl_t
*osh
, void *p
);
173 extern char *osl_pktlist_dump(osl_t
*osh
, char *buf
);
174 #endif /* BCMDBG_PKT */
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
181 osl_pkt_frmnative(osl_pubinfo_t
*osh
, struct sk_buff
*skb
)
183 struct sk_buff
*nskb
;
186 bzero((void*)skb
->cb
, OSL_PKTTAG_SZ
);
188 /* Increment the packet counter */
189 for (nskb
= skb
; nskb
; nskb
= nskb
->next
) {
191 osl_pktlist_add((osl_t
*)osh
, (void *) nskb
);
192 #endif /* BCMDBG_PKT */
198 #define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t *)osh), (struct sk_buff*)(skb))
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
205 static INLINE
struct sk_buff
*
206 osl_pkt_tonative(osl_pubinfo_t
*osh
, void *pkt
)
208 struct sk_buff
*nskb
;
211 bzero(((struct sk_buff
*)pkt
)->cb
, OSL_PKTTAG_SZ
);
213 /* Decrement the packet counter */
214 for (nskb
= (struct sk_buff
*)pkt
; nskb
; nskb
= nskb
->next
) {
216 osl_pktlist_remove((osl_t
*)osh
, (void *) nskb
);
217 #endif /* BCMDBG_PKT */
221 return (struct sk_buff
*)pkt
;
223 #define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_pubinfo_t *)(osh), (pkt))
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)
235 extern void *osl_pktget(osl_t
*osh
, uint len
);
236 extern void osl_pktfree(osl_t
*osh
, void *skb
, bool send
);
237 extern void *osl_pktdup(osl_t
*osh
, void *skb
);
243 #define printf(fmt, args...) osl_printf((fmt), ## args)
245 #define sprintf(buf, fmt, args...) osl_sprintf((buf), (fmt), ## args)
247 #define strcmp(s1, s2) osl_strcmp((s1), (s2))
249 #define strncmp(s1, s2, n) osl_strncmp((s1), (s2), (n))
251 #define strlen(s) osl_strlen((s))
253 #define strcpy(d, s) osl_strcpy((d), (s))
255 #define strncpy(d, s, n) osl_strncpy((d), (s), (n))
256 #endif /* LINUX_OSL */
257 extern int osl_printf(const char *format
, ...);
258 extern int osl_sprintf(char *buf
, const char *format
, ...);
259 extern int osl_strcmp(const char *s1
, const char *s2
);
260 extern int osl_strncmp(const char *s1
, const char *s2
, uint n
);
261 extern int osl_strlen(const char *s
);
262 extern char* osl_strcpy(char *d
, const char *s
);
263 extern char* osl_strncpy(char *d
, const char *s
, uint n
);
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)) \
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; \
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))
283 extern uint8
osl_readb(volatile uint8
*r
);
284 extern uint16
osl_readw(volatile uint16
*r
);
285 extern uint32
osl_readl(volatile uint32
*r
);
286 extern void osl_writeb(uint8 v
, volatile uint8
*r
);
287 extern void osl_writew(uint16 v
, volatile uint16
*r
);
288 extern void osl_writel(uint32 v
, volatile uint32
*r
);
290 /* bcopy, bcmp, and bzero */
291 extern void bcopy(const void *src
, void *dst
, int len
);
292 extern int bcmp(const void *b1
, const void *b2
, int len
);
293 extern void bzero(void *b
, int len
);
295 /* uncached virtual address */
296 #define OSL_UNCACHED(va) osl_uncached((va))
297 extern void *osl_uncached(void *va
);
299 /* get processor cycle count */
300 #define OSL_GETCYCLES(x) ((x) = osl_getcycles())
301 extern uint
osl_getcycles(void);
303 /* dereference an address that may target abort */
304 #define BUSPROBE(val, addr) osl_busprobe(&(val), (addr))
305 extern int osl_busprobe(uint32
*val
, uint32 addr
);
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))
310 extern void *osl_reg_map(uint32 pa
, uint size
);
311 extern void osl_reg_unmap(void *va
);
313 /* shared (dma-able) memory access macros */
315 #define W_SM(r, v) (*(r) = (v))
316 #define BZERO_SM(r, len) bzero((r), (len))
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))
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 */
346 extern void *osl_pktget(osl_t
*osh
, uint len
);
347 extern void osl_pktfree(osl_t
*osh
, void *skb
, bool send
);
348 extern uchar
*osl_pktdata(osl_t
*osh
, void *skb
);
349 extern uint
osl_pktlen(osl_t
*osh
, void *skb
);
350 extern uint
osl_pktheadroom(osl_t
*osh
, void *skb
);
351 extern uint
osl_pkttailroom(osl_t
*osh
, void *skb
);
352 extern void *osl_pktnext(osl_t
*osh
, void *skb
);
353 extern void osl_pktsetnext(void *skb
, void *x
);
354 extern void osl_pktsetlen(osl_t
*osh
, void *skb
, uint len
);
355 extern uchar
*osl_pktpush(osl_t
*osh
, void *skb
, int bytes
);
356 extern uchar
*osl_pktpull(osl_t
*osh
, void *skb
, int bytes
);
357 extern void *osl_pktdup(osl_t
*osh
, void *skb
);
358 extern void *osl_pkttag(void *skb
);
359 extern void *osl_pktlink(void *skb
);
360 extern void osl_pktsetlink(void *skb
, void *x
);
361 extern uint
osl_pktprio(void *skb
);
362 extern void osl_pktsetprio(void *skb
, uint x
);
363 extern void *osl_pkt_frmnative(osl_t
*osh
, struct sk_buff
*skb
);
364 extern struct sk_buff
*osl_pkt_tonative(osl_t
*osh
, void *pkt
);
365 extern bool osl_pktshared(void *skb
);
366 extern uint
osl_pktalloced(osl_t
*osh
);
368 #ifdef BCMDBG_PKT /* pkt logging for debugging */
369 extern char *osl_pktlist_dump(osl_t
*osh
, char *buf
);
370 extern void osl_pktlist_add(osl_t
*osh
, void *p
);
371 extern void osl_pktlist_remove(osl_t
*osh
, void *p
);
372 #endif /* BCMDBG_PKT */
376 #define OSL_ERROR(bcmerror) osl_error(bcmerror)
377 extern int osl_error(int bcmerror
);
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 */
382 #endif /* _linux_osl_h_ */
This page took 0.082978 seconds and 5 git commands to generate.