Commit | Line | Data |
---|---|---|
635d2b00 GKH |
1 | /***************************************************************************** |
2 | ||
3 | (c) Cambridge Silicon Radio Limited 2011 | |
4 | All rights reserved and confidential information of CSR | |
5 | ||
6 | Refer to LICENSE.txt included with this source for details | |
7 | on the license terms. | |
8 | ||
9 | *****************************************************************************/ | |
10 | ||
11 | #include <linux/module.h> | |
786eeeb3 | 12 | #include <linux/slab.h> |
635d2b00 | 13 | #include "csr_pmem.h" |
d63123fc | 14 | #include "csr_macro.h" |
635d2b00 GKH |
15 | #include "csr_msgconv.h" |
16 | #include "csr_wifi_msgconv.h" | |
17 | #include "csr_wifi_lib.h" | |
18 | ||
d4fda8db | 19 | void CsrUint24Des(u32 *v, u8 *buffer, size_t *offset) |
635d2b00 | 20 | { |
26a6b2e1 | 21 | u32 val; |
635d2b00 GKH |
22 | |
23 | val = ((buffer[(*offset) + 2] << 16) | | |
24 | (buffer[(*offset) + 1] << 8) | | |
25 | (buffer[(*offset)])); | |
26 | ||
27 | *offset += 3; | |
28 | *v = val; | |
29 | } | |
30 | ||
31 | ||
32 | /* Big endian :e.g WSC, TCLAS */ | |
d4fda8db | 33 | void CsrUint16DesBigEndian(u16 *v, u8 *buffer, size_t *offset) |
635d2b00 | 34 | { |
8c87f69a | 35 | u16 val; |
635d2b00 GKH |
36 | |
37 | val = (buffer[(*offset)] << 8) | (buffer[(*offset) + 1]); | |
38 | *offset += 2; | |
39 | ||
40 | *v = val; | |
41 | } | |
42 | ||
43 | ||
d4fda8db | 44 | void CsrUint24DesBigEndian(u32 *v, u8 *buffer, size_t *offset) |
635d2b00 | 45 | { |
26a6b2e1 | 46 | u32 val; |
635d2b00 GKH |
47 | |
48 | val = ((buffer[(*offset)] << 16) | | |
49 | (buffer[(*offset) + 1] << 8) | | |
50 | (buffer[(*offset) + 2])); | |
51 | ||
52 | *offset += 3; | |
53 | *v = val; | |
54 | } | |
55 | ||
56 | ||
d4fda8db | 57 | void CsrUint32DesBigEndian(u32 *v, u8 *buffer, size_t *offset) |
635d2b00 | 58 | { |
26a6b2e1 | 59 | u32 val; |
635d2b00 GKH |
60 | |
61 | val = ((buffer[(*offset)] << 24) | | |
62 | (buffer[(*offset) + 1] << 16) | | |
63 | (buffer[(*offset) + 2] << 8) | | |
64 | (buffer[(*offset) + 3])); | |
65 | ||
66 | *offset += 4; | |
67 | *v = val; | |
68 | } | |
69 | ||
70 | ||
d4fda8db | 71 | void CsrUint24Ser(u8 *ptr, size_t *len, u32 v) |
635d2b00 | 72 | { |
7e6f5794 GKH |
73 | ptr[(*len) + 2] = (u8)((v & 0x00ff0000) >> 16); |
74 | ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8); | |
75 | ptr[(*len)] = (u8)((v & 0x000000ff)); | |
635d2b00 GKH |
76 | |
77 | *len += 3; | |
78 | } | |
79 | ||
80 | ||
81 | /* Big endian :e.g WSC, TCLAS */ | |
d4fda8db | 82 | void CsrUint16SerBigEndian(u8 *ptr, size_t *len, u16 v) |
635d2b00 | 83 | { |
7e6f5794 GKH |
84 | ptr[(*len)] = (u8)((v & 0xff00) >> 8); |
85 | ptr[(*len) + 1] = (u8)((v & 0x00ff)); | |
635d2b00 GKH |
86 | |
87 | *len += 2; | |
88 | } | |
89 | ||
90 | ||
d4fda8db | 91 | void CsrUint32SerBigEndian(u8 *ptr, size_t *len, u32 v) |
635d2b00 | 92 | { |
7e6f5794 GKH |
93 | ptr[(*len)] = (u8)((v & 0xff000000) >> 24); |
94 | ptr[(*len) + 1] = (u8)((v & 0x00ff0000) >> 16); | |
95 | ptr[(*len) + 2] = (u8)((v & 0x0000ff00) >> 8); | |
96 | ptr[(*len) + 3] = (u8)((v & 0x000000ff)); | |
635d2b00 GKH |
97 | |
98 | *len += 4; | |
99 | } | |
100 | ||
101 | ||
d4fda8db | 102 | void CsrUint24SerBigEndian(u8 *ptr, size_t *len, u32 v) |
635d2b00 | 103 | { |
7e6f5794 GKH |
104 | ptr[(*len)] = (u8)((v & 0x00ff0000) >> 16); |
105 | ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8); | |
106 | ptr[(*len) + 2] = (u8)((v & 0x000000ff)); | |
635d2b00 GKH |
107 | |
108 | *len += 3; | |
109 | } | |
110 | ||
111 | ||
d4fda8db | 112 | size_t CsrWifiEventSizeof(void *msg) |
635d2b00 GKH |
113 | { |
114 | return 2; | |
115 | } | |
116 | EXPORT_SYMBOL_GPL(CsrWifiEventSizeof); | |
117 | ||
d4fda8db | 118 | u8* CsrWifiEventSer(u8 *ptr, size_t *len, void *msg) |
635d2b00 GKH |
119 | { |
120 | CsrWifiFsmEvent *primitive = (CsrWifiFsmEvent *)msg; | |
121 | *len = 0; | |
122 | CsrUint16Ser(ptr, len, primitive->type); | |
123 | return(ptr); | |
124 | } | |
125 | EXPORT_SYMBOL_GPL(CsrWifiEventSer); | |
126 | ||
d4fda8db | 127 | void* CsrWifiEventDes(u8 *buffer, size_t length) |
635d2b00 | 128 | { |
786eeeb3 | 129 | CsrWifiFsmEvent *primitive = kmalloc(sizeof(CsrWifiFsmEvent), GFP_KERNEL); |
d4fda8db | 130 | size_t offset = 0; |
635d2b00 GKH |
131 | CsrUint16Des(&primitive->type, buffer, &offset); |
132 | ||
133 | return primitive; | |
134 | } | |
135 | EXPORT_SYMBOL_GPL(CsrWifiEventDes); | |
136 | ||
d4fda8db | 137 | size_t CsrWifiEventCsrUint8Sizeof(void *msg) |
635d2b00 GKH |
138 | { |
139 | return 3; | |
140 | } | |
141 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Sizeof); | |
142 | ||
d4fda8db | 143 | u8* CsrWifiEventCsrUint8Ser(u8 *ptr, size_t *len, void *msg) |
635d2b00 GKH |
144 | { |
145 | CsrWifiEventCsrUint8 *primitive = (CsrWifiEventCsrUint8 *)msg; | |
146 | *len = 0; | |
147 | CsrUint16Ser(ptr, len, primitive->common.type); | |
148 | CsrUint8Ser(ptr, len, primitive->value); | |
149 | return(ptr); | |
150 | } | |
151 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Ser); | |
152 | ||
153 | ||
d4fda8db | 154 | void* CsrWifiEventCsrUint8Des(u8 *buffer, size_t length) |
635d2b00 | 155 | { |
786eeeb3 | 156 | CsrWifiEventCsrUint8 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint8), GFP_KERNEL); |
635d2b00 | 157 | |
d4fda8db | 158 | size_t offset = 0; |
635d2b00 GKH |
159 | CsrUint16Des(&primitive->common.type, buffer, &offset); |
160 | CsrUint8Des(&primitive->value, buffer, &offset); | |
161 | ||
162 | return primitive; | |
163 | } | |
164 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Des); | |
165 | ||
166 | ||
d4fda8db | 167 | size_t CsrWifiEventCsrUint16Sizeof(void *msg) |
635d2b00 GKH |
168 | { |
169 | return 4; | |
170 | } | |
171 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Sizeof); | |
172 | ||
173 | ||
d4fda8db | 174 | u8* CsrWifiEventCsrUint16Ser(u8 *ptr, size_t *len, void *msg) |
635d2b00 GKH |
175 | { |
176 | CsrWifiEventCsrUint16 *primitive = (CsrWifiEventCsrUint16 *)msg; | |
177 | *len = 0; | |
178 | CsrUint16Ser(ptr, len, primitive->common.type); | |
179 | CsrUint16Ser(ptr, len, primitive->value); | |
180 | return(ptr); | |
181 | } | |
182 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Ser); | |
183 | ||
d4fda8db | 184 | void* CsrWifiEventCsrUint16Des(u8 *buffer, size_t length) |
635d2b00 | 185 | { |
786eeeb3 | 186 | CsrWifiEventCsrUint16 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint16), GFP_KERNEL); |
635d2b00 | 187 | |
d4fda8db | 188 | size_t offset = 0; |
635d2b00 GKH |
189 | CsrUint16Des(&primitive->common.type, buffer, &offset); |
190 | CsrUint16Des(&primitive->value, buffer, &offset); | |
191 | ||
192 | return primitive; | |
193 | } | |
194 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Des); | |
195 | ||
196 | ||
d4fda8db | 197 | size_t CsrWifiEventCsrUint32Sizeof(void *msg) |
635d2b00 GKH |
198 | { |
199 | return 6; | |
200 | } | |
201 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Sizeof); | |
202 | ||
d4fda8db | 203 | u8* CsrWifiEventCsrUint32Ser(u8 *ptr, size_t *len, void *msg) |
635d2b00 GKH |
204 | { |
205 | CsrWifiEventCsrUint32 *primitive = (CsrWifiEventCsrUint32 *)msg; | |
206 | *len = 0; | |
207 | CsrUint16Ser(ptr, len, primitive->common.type); | |
208 | CsrUint32Ser(ptr, len, primitive->value); | |
209 | return(ptr); | |
210 | } | |
211 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Ser); | |
212 | ||
213 | ||
d4fda8db | 214 | void* CsrWifiEventCsrUint32Des(u8 *buffer, size_t length) |
635d2b00 | 215 | { |
786eeeb3 | 216 | CsrWifiEventCsrUint32 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint32), GFP_KERNEL); |
635d2b00 | 217 | |
d4fda8db | 218 | size_t offset = 0; |
635d2b00 GKH |
219 | CsrUint16Des(&primitive->common.type, buffer, &offset); |
220 | CsrUint32Des(&primitive->value, buffer, &offset); | |
221 | ||
222 | return primitive; | |
223 | } | |
224 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Des); | |
225 | ||
d4fda8db | 226 | size_t CsrWifiEventCsrUint16CsrUint8Sizeof(void *msg) |
635d2b00 GKH |
227 | { |
228 | return 5; | |
229 | } | |
230 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Sizeof); | |
231 | ||
d4fda8db | 232 | u8* CsrWifiEventCsrUint16CsrUint8Ser(u8 *ptr, size_t *len, void *msg) |
635d2b00 GKH |
233 | { |
234 | CsrWifiEventCsrUint16CsrUint8 *primitive = (CsrWifiEventCsrUint16CsrUint8 *)msg; | |
235 | *len = 0; | |
236 | CsrUint16Ser(ptr, len, primitive->common.type); | |
237 | CsrUint16Ser(ptr, len, primitive->value16); | |
238 | CsrUint8Ser(ptr, len, primitive->value8); | |
239 | return(ptr); | |
240 | } | |
241 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Ser); | |
242 | ||
243 | ||
d4fda8db | 244 | void* CsrWifiEventCsrUint16CsrUint8Des(u8 *buffer, size_t length) |
635d2b00 | 245 | { |
786eeeb3 | 246 | CsrWifiEventCsrUint16CsrUint8 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint16CsrUint8), GFP_KERNEL); |
635d2b00 | 247 | |
d4fda8db | 248 | size_t offset = 0; |
635d2b00 GKH |
249 | CsrUint16Des(&primitive->common.type, buffer, &offset); |
250 | CsrUint16Des(&primitive->value16, buffer, &offset); | |
251 | CsrUint8Des(&primitive->value8, buffer, &offset); | |
252 | ||
253 | return primitive; | |
254 | } | |
255 | EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Des); | |
256 | ||
257 |