finally move buildroot-ng to trunk
[openwrt/openwrt.git] / package / broadcom-wl / src / kmod / linux_osl.h
1 /*
2 * Linux OS Independent Layer
3 *
4 * Copyright 2006, 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 * $Id: linux_osl.h,v 1.1.1.13 2006/04/08 06:13:39 honor Exp $
13 */
14
15 #ifndef _linux_osl_h_
16 #define _linux_osl_h_
17
18 #include <typedefs.h>
19 #include <linuxver.h>
20 #include <osl.h>
21
22 #define OSL_PKTTAG_SZ 32 /* Size of PktTag */
23
24 /* osl handle type forward declaration */
25 typedef struct osl_dmainfo osldma_t;
26
27 /* OSL initialization */
28 extern osl_t *osl_attach(void *pdev, bool pkttag);
29 extern void osl_detach(osl_t *osh);
30
31 /* host/bus architecture-specific byte swap */
32 #define BUS_SWAP32(v) (v)
33 #define MALLOC_FAILED(osh) osl_malloc_failed((osh))
34
35 extern void *osl_malloc(osl_t *osh, uint size);
36 extern void osl_mfree(osl_t *osh, void *addr, uint size);
37 extern uint osl_malloced(osl_t *osh);
38 extern uint osl_malloc_failed(osl_t *osh);
39
40 /* API for DMA addressing capability */
41 #define DMA_MAP(osh, va, size, direction, p) \
42 osl_dma_map((osh), (va), (size), (direction))
43 #define DMA_UNMAP(osh, pa, size, direction, p) \
44 osl_dma_unmap((osh), (pa), (size), (direction))
45 static inline uint
46 osl_dma_map(void *osh, void *va, uint size, int direction)
47 {
48 int dir;
49 struct pci_dev *dev;
50
51 dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
52 dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
53 return (pci_map_single(dev, va, size, dir));
54 }
55
56 static inline void
57 osl_dma_unmap(void *osh, uint pa, uint size, int direction)
58 {
59 int dir;
60 struct pci_dev *dev;
61
62 dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
63 dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
64 pci_unmap_single(dev, (uint32)pa, size, dir);
65 }
66
67 #define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
68 #define DMA_CONSISTENT_ALIGN PAGE_SIZE
69 #define DMA_ALLOC_CONSISTENT(osh, size, pap, dmah) \
70 osl_dma_alloc_consistent((osh), (size), (pap))
71 #define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
72 osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
73 static inline void*
74 osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap)
75 {
76 return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap));
77 }
78
79 static inline void
80 osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa)
81 {
82 pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa);
83 }
84
85
86 /* register access macros */
87 #if defined(BCMJTAG)
88 #include <bcmjtag.h>
89 #define R_REG(osh, r) bcmjtag_read(NULL, (uint32)(r), sizeof(*(r)))
90 #define W_REG(osh, r, v) bcmjtag_write(NULL, (uint32)(r), (uint32)(v), sizeof(*(r)))
91 #endif /* defined(BCMSDIO) */
92
93 /* packet primitives */
94 #define PKTGET(osh, len, send) osl_pktget((osh), (len), (send))
95 #define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb))
96 #define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data)
97 #define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len)
98 #define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
99 #define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail))
100 #define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next)
101 #define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x))
102 #define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len))
103 #define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes))
104 #define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes))
105 #define PKTDUP(osh, skb) osl_pktdup((osh), (skb))
106 #define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb))
107 #define PKTALLOCED(osh) osl_pktalloced((osh))
108 #define PKTLIST_DUMP(osh, buf)
109
110 /* Convert a native(OS) packet to driver packet.
111 * In the process, native packet is destroyed, there is no copying
112 * Also, a packettag is zeroed out
113 */
114 static INLINE void *
115 osl_pkt_frmnative(struct osl_pubinfo *osh, struct sk_buff *skb)
116 {
117 struct sk_buff *nskb;
118
119 if (osh->pkttag)
120 bzero((void*)skb->cb, OSL_PKTTAG_SZ);
121
122 /* Increment the packet counter */
123 for (nskb = skb; nskb; nskb = nskb->next) {
124 osh->pktalloced++;
125 }
126
127 return (void *)skb;
128 }
129 #define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((struct osl_pubinfo *)osh), \
130 (struct sk_buff*)(skb))
131
132 /* Convert a driver packet to native(OS) packet
133 * In the process, packettag is zeroed out before sending up
134 * IP code depends on skb->cb to be setup correctly with various options
135 * In our case, that means it should be 0
136 */
137 static INLINE struct sk_buff *
138 osl_pkt_tonative(struct osl_pubinfo *osh, void *pkt)
139 {
140 struct sk_buff *nskb;
141
142 if (osh->pkttag)
143 bzero(((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
144
145 /* Decrement the packet counter */
146 for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
147 osh->pktalloced--;
148 }
149
150 return (struct sk_buff *)pkt;
151 }
152 #define PKTTONATIVE(osh, pkt) osl_pkt_tonative((struct osl_pubinfo *)(osh), (pkt))
153
154 #define PKTLINK(skb) (((struct sk_buff*)(skb))->prev)
155 #define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
156 #define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority)
157 #define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x))
158 #define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned)
159
160 extern void *osl_pktget(osl_t *osh, uint len, bool send);
161 extern void osl_pktfree(osl_t *osh, void *skb);
162 extern void *osl_pktdup(osl_t *osh, void *skb);
163 extern uint osl_pktalloced(osl_t *osh);
164
165 #define OSL_ERROR(bcmerror) osl_error(bcmerror)
166 extern int osl_error(int bcmerror);
167
168 /* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
169 #define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */
170
171 #endif /* _linux_osl_h_ */