added files
[bcm963xx.git] / bcmdrivers / broadcom / net / wl / impl1 / shared / linux_osl_pkt.c
1 /*
2  * Linux OS Independent Layer For SKB Packet Handling
3  *
4  * Copyright 2005, 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$
13  */
14
15 #define LINUX_OSL_PKT
16
17 #include <typedefs.h>
18 #include <linux/netdevice.h>
19 #include <linux/skbuff.h>
20 /*
21  * BINOSL selects the slightly slower function-call-based binary compatible osl.
22  */
23
24 #ifndef osl_t 
25 #define osl_t void
26 #endif
27
28 void
29 osl_pktsetcookie(void *skb, void *x)
30 {
31         ((struct sk_buff*)skb)->csum = (uint)x;
32 }
33
34 void*
35 osl_pktget(osl_t *osh, uint len, bool send)
36 {
37         struct sk_buff *skb;
38
39         if ((skb = dev_alloc_skb(len)) == NULL)
40                 return (NULL);
41
42         skb_put(skb, len);
43
44         /* ensure the cookie field is cleared */ 
45         osl_pktsetcookie(skb, NULL);
46
47         return ((void*) skb);
48 }
49
50 void
51 osl_pktfree(void *p)
52 {
53         struct sk_buff *skb, *nskb;
54
55         skb = (struct sk_buff*) p;
56
57         /* perversion: we use skb->next to chain multi-skb packets */
58         while (skb) {
59                 nskb = skb->next;
60                 skb->next = NULL;
61 #ifdef DSLCPE
62                 dev_kfree_skb_any(skb);
63 #else           
64                 if (skb->destructor) {
65                         /* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if destructor exists */
66                         dev_kfree_skb_any(skb);
67                 } else {
68                         /* can free immediately (even in_irq()) if destructor does not exist */
69                         dev_kfree_skb(skb);
70                 }
71 #endif          
72                 skb = nskb;
73         }
74 }
75
76 uchar*
77 osl_pktdata(osl_t *osh, void *skb)
78 {
79         return (((struct sk_buff*)skb)->data);
80 }
81
82 uint
83 osl_pktlen(osl_t *osh, void *skb)
84 {
85         return (((struct sk_buff*)skb)->len);
86 }
87
88 uint
89 osl_pktheadroom(osl_t *osh, void *skb)
90 {
91         return (uint) skb_headroom((struct sk_buff *) skb);
92 }
93
94 uint
95 osl_pkttailroom(osl_t *osh, void *skb)
96 {
97         return (uint) skb_tailroom((struct sk_buff *) skb);
98 }
99
100 void*
101 osl_pktnext(osl_t *osh, void *skb)
102 {
103         return (((struct sk_buff*)skb)->next);
104 }
105
106 void
107 osl_pktsetnext(void *skb, void *x)
108 {
109         ((struct sk_buff*)skb)->next = (struct sk_buff*)x;
110 }
111
112 void
113 osl_pktsetlen(osl_t *osh, void *skb, uint len)
114 {
115         __skb_trim((struct sk_buff*)skb, len);
116 }
117
118 uchar*
119 osl_pktpush(osl_t *osh, void *skb, int bytes)
120 {
121         return (skb_push((struct sk_buff*)skb, bytes));
122 }
123
124 uchar*
125 osl_pktpull(osl_t *osh, void *skb, int bytes)
126 {
127         return (skb_pull((struct sk_buff*)skb, bytes));
128 }
129
130 void*
131 osl_pktdup(osl_t *osh, void *skb)
132 {
133         return (skb_clone((struct sk_buff*)skb, GFP_ATOMIC));
134 }
135
136 void*
137 osl_pktcookie(void *skb)
138 {
139         return ((void*)((struct sk_buff*)skb)->csum);
140 }
141
142 void*
143 osl_pktlink(void *skb)
144 {
145         return (((struct sk_buff*)skb)->prev);
146 }
147
148 void
149 osl_pktsetlink(void *skb, void *x)
150 {
151         ((struct sk_buff*)skb)->prev = (struct sk_buff*)x;
152 }
153
154 #ifdef DSLCPE
155 #define PRIO_LOC_NFMARK 16
156 #endif
157
158 uint
159 osl_pktprio(void *skb)
160 {
161 #ifdef DSLCPE
162         ((struct sk_buff*)skb)->priority = ((struct sk_buff*)skb)->nfmark>>PRIO_LOC_NFMARK & 0x7;
163 #endif
164         return (((struct sk_buff*)skb)->priority);
165 }
166
167 void
168 osl_pktsetprio(void *skb, uint x)
169 {
170         ((struct sk_buff*)skb)->priority = x;
171
172  #ifdef DSLCPE
173     ((struct sk_buff*)skb)->nfmark &= ~(0xf << PRIO_LOC_NFMARK);
174     ((struct sk_buff*)skb)->nfmark |= (x & 0x7) << PRIO_LOC_NFMARK;
175  #endif
176 }
177
178
179 EXPORT_SYMBOL(osl_pktsetcookie);
180 EXPORT_SYMBOL(osl_pktget);
181 EXPORT_SYMBOL(osl_pktfree);
182 EXPORT_SYMBOL(osl_pktdata);
183 EXPORT_SYMBOL(osl_pktlen);
184 EXPORT_SYMBOL(osl_pktheadroom);
185 EXPORT_SYMBOL(osl_pkttailroom);
186 EXPORT_SYMBOL(osl_pktnext);
187 EXPORT_SYMBOL(osl_pktsetnext);
188 EXPORT_SYMBOL(osl_pktsetlen);
189 EXPORT_SYMBOL(osl_pktpush);
190 EXPORT_SYMBOL(osl_pktpull);
191 EXPORT_SYMBOL(osl_pktdup);
192 EXPORT_SYMBOL(osl_pktcookie);
193 EXPORT_SYMBOL(osl_pktlink);
194 EXPORT_SYMBOL(osl_pktsetlink);
195 EXPORT_SYMBOL(osl_pktprio);
196 EXPORT_SYMBOL(osl_pktsetprio);