diff options
author | Forest Bond <forest@alittletooquiet.net> | 2009-06-13 07:38:31 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-15 15:01:32 -0400 |
commit | 92b96797118e5836294a6d42a5a8e10b86f50e3f (patch) | |
tree | 1eceb1d70adc634da006f38c951a515de746e2c2 /drivers/staging/vt6656/mac.c | |
parent | 36c7928c3e948cf8862d4b5c3df27c5a841cb503 (diff) |
Staging: Add pristine upstream vt6656 driver sources to drivers/staging/vt6656.
Add pristine upstream vt6656 driver sources to drivers/staging/vt6656. These
files were copied from the driver directory in the upstream source archive,
available here:
http://www.viaarena.com/Driver/VT6656_Linux_src_v1.19_12_x86.zip
After copying, trailing whitespace was stripped. This is GPL-licensed code.
Signed-off-by: Forest Bond <forest@alittletooquiet.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/vt6656/mac.c')
-rw-r--r-- | drivers/staging/vt6656/mac.c | 500 |
1 files changed, 500 insertions, 0 deletions
diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c new file mode 100644 index 00000000000..ff83ef4afa9 --- /dev/null +++ b/drivers/staging/vt6656/mac.c | |||
@@ -0,0 +1,500 @@ | |||
1 | /* | ||
2 | * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. | ||
3 | * All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along | ||
16 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | * | ||
19 | * | ||
20 | * File: mac.c | ||
21 | * | ||
22 | * Purpose: MAC routines | ||
23 | * | ||
24 | * Author: Tevin Chen | ||
25 | * | ||
26 | * Date: May 21, 1996 | ||
27 | * | ||
28 | * Functions: | ||
29 | * | ||
30 | * Revision History: | ||
31 | */ | ||
32 | |||
33 | |||
34 | |||
35 | #if !defined(__TMACRO_H__) | ||
36 | #include "tmacro.h" | ||
37 | #endif | ||
38 | #if !defined(__TBIT_H__) | ||
39 | #include "tbit.h" | ||
40 | #endif | ||
41 | #if !defined(__TETHER_H__) | ||
42 | #include "tether.h" | ||
43 | #endif | ||
44 | #if !defined(__DESC_H__) | ||
45 | #include "desc.h" | ||
46 | #endif | ||
47 | #if !defined(__MAC_H__) | ||
48 | #include "mac.h" | ||
49 | #endif | ||
50 | #if !defined(__80211hdr_H__) | ||
51 | #include "80211hdr.h" | ||
52 | #endif | ||
53 | #if !defined(__RNDIS_H__) | ||
54 | #include "rndis.h" | ||
55 | #endif | ||
56 | #if !defined(__CONTROL_H__) | ||
57 | #include "control.h" | ||
58 | #endif | ||
59 | /*--------------------- Static Definitions -------------------------*/ | ||
60 | //static int msglevel =MSG_LEVEL_DEBUG; | ||
61 | static int msglevel =MSG_LEVEL_INFO; | ||
62 | /*--------------------- Static Classes ----------------------------*/ | ||
63 | |||
64 | /*--------------------- Static Variables --------------------------*/ | ||
65 | |||
66 | /*--------------------- Static Functions --------------------------*/ | ||
67 | |||
68 | /*--------------------- Export Variables --------------------------*/ | ||
69 | |||
70 | /*--------------------- Export Functions --------------------------*/ | ||
71 | |||
72 | |||
73 | |||
74 | |||
75 | |||
76 | /* | ||
77 | * Description: | ||
78 | * Set this hash index into multicast address register bit | ||
79 | * | ||
80 | * Parameters: | ||
81 | * In: | ||
82 | * byHashIdx - Hash index to set | ||
83 | * Out: | ||
84 | * none | ||
85 | * | ||
86 | * Return Value: none | ||
87 | * | ||
88 | */ | ||
89 | void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx) | ||
90 | { | ||
91 | UINT uByteIdx; | ||
92 | BYTE byBitMask; | ||
93 | BYTE pbyData[2]; | ||
94 | |||
95 | |||
96 | // calculate byte position | ||
97 | uByteIdx = byHashIdx / 8; | ||
98 | |||
99 | // calculate bit position | ||
100 | byBitMask = 1; | ||
101 | byBitMask <<= (byHashIdx % 8); | ||
102 | // turn on the bit | ||
103 | |||
104 | pbyData[0] = byBitMask; | ||
105 | pbyData[1] = byBitMask; | ||
106 | |||
107 | CONTROLnsRequestOut(pDevice, | ||
108 | MESSAGE_TYPE_WRITE_MASK, | ||
109 | (WORD) (MAC_REG_MAR0 + uByteIdx), | ||
110 | MESSAGE_REQUEST_MACREG, | ||
111 | 2, | ||
112 | pbyData); | ||
113 | } | ||
114 | |||
115 | |||
116 | |||
117 | /* | ||
118 | * Description: | ||
119 | * Write MAC Multicast Address Mask | ||
120 | * | ||
121 | * Parameters: | ||
122 | * In: | ||
123 | * uByteidx - Index of Mask | ||
124 | * byData - Mask Value to write | ||
125 | * Out: | ||
126 | * none | ||
127 | * | ||
128 | * Return Value: none | ||
129 | * | ||
130 | */ | ||
131 | VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData) | ||
132 | { | ||
133 | BYTE byData1; | ||
134 | |||
135 | byData1 = byData; | ||
136 | CONTROLnsRequestOut(pDevice, | ||
137 | MESSAGE_TYPE_WRITE, | ||
138 | (WORD) (MAC_REG_MAR0 + uByteIdx), | ||
139 | MESSAGE_REQUEST_MACREG, | ||
140 | 1, | ||
141 | &byData1); | ||
142 | } | ||
143 | |||
144 | |||
145 | /* | ||
146 | * Description: | ||
147 | * Shut Down MAC | ||
148 | * | ||
149 | * Parameters: | ||
150 | * In: | ||
151 | * Out: | ||
152 | * none | ||
153 | * | ||
154 | * Return Value: TRUE if success; otherwise FALSE | ||
155 | * | ||
156 | */ | ||
157 | BOOL MACbShutdown (PSDevice pDevice) | ||
158 | { | ||
159 | CONTROLnsRequestOutAsyn(pDevice, | ||
160 | MESSAGE_TYPE_MACSHUTDOWN, | ||
161 | 0, | ||
162 | 0, | ||
163 | 0, | ||
164 | NULL | ||
165 | ); | ||
166 | return TRUE; | ||
167 | } | ||
168 | |||
169 | void MACvSetBBType(PSDevice pDevice,BYTE byType) | ||
170 | { | ||
171 | BYTE pbyData[2]; | ||
172 | |||
173 | |||
174 | pbyData[0] = byType; | ||
175 | pbyData[1] = EnCFG_BBType_MASK; | ||
176 | |||
177 | CONTROLnsRequestOut(pDevice, | ||
178 | MESSAGE_TYPE_WRITE_MASK, | ||
179 | MAC_REG_ENCFG0, | ||
180 | MESSAGE_REQUEST_MACREG, | ||
181 | 2, | ||
182 | pbyData | ||
183 | ); | ||
184 | } | ||
185 | |||
186 | void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData) | ||
187 | { | ||
188 | BYTE pbyData[4]; | ||
189 | |||
190 | if (wOffset > 273) | ||
191 | return; | ||
192 | pbyData[0] = (BYTE)dwData; | ||
193 | pbyData[1] = (BYTE)(dwData>>8); | ||
194 | pbyData[2] = (BYTE)(dwData>>16); | ||
195 | pbyData[3] = (BYTE)(dwData>>24); | ||
196 | |||
197 | CONTROLnsRequestOut(pDevice, | ||
198 | MESSAGE_TYPE_WRITE_MISCFF, | ||
199 | wOffset, | ||
200 | 0, | ||
201 | 4, | ||
202 | pbyData | ||
203 | ); | ||
204 | } | ||
205 | |||
206 | /* | ||
207 | * Description: | ||
208 | * Disable the Key Entry by MISCFIFO | ||
209 | * | ||
210 | * Parameters: | ||
211 | * In: | ||
212 | * dwIoBase - Base Address for MAC | ||
213 | * | ||
214 | * Out: | ||
215 | * none | ||
216 | * | ||
217 | * Return Value: none | ||
218 | * | ||
219 | */ | ||
220 | void MACvDisableKeyEntry (PSDevice pDevice, UINT uEntryIdx) | ||
221 | { | ||
222 | WORD wOffset; | ||
223 | BYTE byData; | ||
224 | |||
225 | |||
226 | byData = (BYTE) uEntryIdx; | ||
227 | |||
228 | wOffset = MISCFIFO_KEYETRY0; | ||
229 | wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE); | ||
230 | |||
231 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
232 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0); | ||
233 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); | ||
234 | |||
235 | //issue write misc fifo command to device | ||
236 | CONTROLnsRequestOut(pDevice, | ||
237 | MESSAGE_TYPE_CLRKEYENTRY, | ||
238 | 0, | ||
239 | 0, | ||
240 | 1, | ||
241 | &byData | ||
242 | ); | ||
243 | } | ||
244 | |||
245 | |||
246 | /* | ||
247 | * Description: | ||
248 | * Set the Key by MISCFIFO | ||
249 | * | ||
250 | * Parameters: | ||
251 | * In: | ||
252 | * dwIoBase - Base Address for MAC | ||
253 | * | ||
254 | * Out: | ||
255 | * none | ||
256 | * | ||
257 | * Return Value: none | ||
258 | * | ||
259 | */ | ||
260 | void MACvSetKeyEntry (PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey) | ||
261 | { | ||
262 | PBYTE pbyKey; | ||
263 | WORD wOffset; | ||
264 | DWORD dwData1,dwData2; | ||
265 | int ii; | ||
266 | BYTE pbyData[24]; | ||
267 | |||
268 | |||
269 | |||
270 | |||
271 | |||
272 | if ( pDevice->byLocalID <= MAC_REVISION_A1 ) { | ||
273 | if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP ) | ||
274 | return; | ||
275 | } | ||
276 | |||
277 | wOffset = MISCFIFO_KEYETRY0; | ||
278 | wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE); | ||
279 | |||
280 | dwData1 = 0; | ||
281 | dwData1 |= wKeyCtl; | ||
282 | dwData1 <<= 16; | ||
283 | dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5)); | ||
284 | |||
285 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); | ||
286 | |||
287 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
288 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
289 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); | ||
290 | |||
291 | //wOffset++; | ||
292 | |||
293 | dwData2 = 0; | ||
294 | dwData2 |= *(pbyAddr+3); | ||
295 | dwData2 <<= 8; | ||
296 | dwData2 |= *(pbyAddr+2); | ||
297 | dwData2 <<= 8; | ||
298 | dwData2 |= *(pbyAddr+1); | ||
299 | dwData2 <<= 8; | ||
300 | dwData2 |= *(pbyAddr+0); | ||
301 | |||
302 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2); | ||
303 | |||
304 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
305 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
306 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); | ||
307 | |||
308 | //wOffset++; | ||
309 | |||
310 | //wOffset += (uKeyIdx * 4); | ||
311 | /* for (ii=0;ii<4;ii++) { | ||
312 | // alway push 128 bits | ||
313 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey); | ||
314 | VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii); | ||
315 | VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++); | ||
316 | VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE); | ||
317 | } | ||
318 | */ | ||
319 | pbyKey = (PBYTE)pdwKey; | ||
320 | |||
321 | pbyData[0] = (BYTE)dwData1; | ||
322 | pbyData[1] = (BYTE)(dwData1>>8); | ||
323 | pbyData[2] = (BYTE)(dwData1>>16); | ||
324 | pbyData[3] = (BYTE)(dwData1>>24); | ||
325 | pbyData[4] = (BYTE)dwData2; | ||
326 | pbyData[5] = (BYTE)(dwData2>>8); | ||
327 | pbyData[6] = (BYTE)(dwData2>>16); | ||
328 | pbyData[7] = (BYTE)(dwData2>>24); | ||
329 | for(ii=8;ii<24;ii++) | ||
330 | pbyData[ii] = *pbyKey++; | ||
331 | |||
332 | CONTROLnsRequestOut(pDevice, | ||
333 | MESSAGE_TYPE_SETKEY, | ||
334 | wOffset, | ||
335 | (WORD)uKeyIdx, | ||
336 | 24, | ||
337 | pbyData | ||
338 | ); | ||
339 | |||
340 | |||
341 | } | ||
342 | |||
343 | |||
344 | void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits) | ||
345 | { | ||
346 | BYTE pbyData[2]; | ||
347 | |||
348 | pbyData[0] = 0; | ||
349 | pbyData[1] = byBits; | ||
350 | |||
351 | CONTROLnsRequestOut(pDevice, | ||
352 | MESSAGE_TYPE_WRITE_MASK, | ||
353 | byRegOfs, | ||
354 | MESSAGE_REQUEST_MACREG, | ||
355 | 2, | ||
356 | pbyData | ||
357 | ); | ||
358 | } | ||
359 | |||
360 | |||
361 | void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits) | ||
362 | { | ||
363 | BYTE pbyData[2]; | ||
364 | |||
365 | |||
366 | pbyData[0] = byBits; | ||
367 | pbyData[1] = byBits; | ||
368 | |||
369 | CONTROLnsRequestOut(pDevice, | ||
370 | MESSAGE_TYPE_WRITE_MASK, | ||
371 | byRegOfs, | ||
372 | MESSAGE_REQUEST_MACREG, | ||
373 | 2, | ||
374 | pbyData | ||
375 | ); | ||
376 | } | ||
377 | |||
378 | void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData) | ||
379 | { | ||
380 | BYTE pbyData[2]; | ||
381 | |||
382 | |||
383 | pbyData[0] = (BYTE)(wData & 0xff); | ||
384 | pbyData[1] = (BYTE)(wData >> 8); | ||
385 | |||
386 | CONTROLnsRequestOut(pDevice, | ||
387 | MESSAGE_TYPE_WRITE, | ||
388 | byRegOfs, | ||
389 | MESSAGE_REQUEST_MACREG, | ||
390 | 2, | ||
391 | pbyData | ||
392 | ); | ||
393 | |||
394 | } | ||
395 | |||
396 | void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr) | ||
397 | { | ||
398 | BYTE pbyData[6]; | ||
399 | |||
400 | |||
401 | pbyData[0] = *((PBYTE)pbyEtherAddr); | ||
402 | pbyData[1] = *((PBYTE)pbyEtherAddr+1); | ||
403 | pbyData[2] = *((PBYTE)pbyEtherAddr+2); | ||
404 | pbyData[3] = *((PBYTE)pbyEtherAddr+3); | ||
405 | pbyData[4] = *((PBYTE)pbyEtherAddr+4); | ||
406 | pbyData[5] = *((PBYTE)pbyEtherAddr+5); | ||
407 | |||
408 | CONTROLnsRequestOut(pDevice, | ||
409 | MESSAGE_TYPE_WRITE, | ||
410 | MAC_REG_BSSID0, | ||
411 | MESSAGE_REQUEST_MACREG, | ||
412 | 6, | ||
413 | pbyData | ||
414 | ); | ||
415 | } | ||
416 | |||
417 | void MACvEnableProtectMD(PSDevice pDevice) | ||
418 | { | ||
419 | BYTE pbyData[2]; | ||
420 | |||
421 | |||
422 | pbyData[0] = EnCFG_ProtectMd; | ||
423 | pbyData[1] = EnCFG_ProtectMd; | ||
424 | |||
425 | CONTROLnsRequestOut(pDevice, | ||
426 | MESSAGE_TYPE_WRITE_MASK, | ||
427 | MAC_REG_ENCFG0, | ||
428 | MESSAGE_REQUEST_MACREG, | ||
429 | 2, | ||
430 | pbyData | ||
431 | ); | ||
432 | } | ||
433 | |||
434 | void MACvDisableProtectMD(PSDevice pDevice) | ||
435 | { | ||
436 | BYTE pbyData[2]; | ||
437 | |||
438 | |||
439 | pbyData[0] = 0; | ||
440 | pbyData[1] = EnCFG_ProtectMd; | ||
441 | |||
442 | CONTROLnsRequestOut(pDevice, | ||
443 | MESSAGE_TYPE_WRITE_MASK, | ||
444 | MAC_REG_ENCFG0, | ||
445 | MESSAGE_REQUEST_MACREG, | ||
446 | 2, | ||
447 | pbyData | ||
448 | ); | ||
449 | } | ||
450 | |||
451 | void MACvEnableBarkerPreambleMd(PSDevice pDevice) | ||
452 | { | ||
453 | BYTE pbyData[2]; | ||
454 | |||
455 | |||
456 | pbyData[0] = EnCFG_BarkerPream; | ||
457 | pbyData[1] = EnCFG_BarkerPream; | ||
458 | |||
459 | CONTROLnsRequestOut(pDevice, | ||
460 | MESSAGE_TYPE_WRITE_MASK, | ||
461 | MAC_REG_ENCFG2, | ||
462 | MESSAGE_REQUEST_MACREG, | ||
463 | 2, | ||
464 | pbyData | ||
465 | ); | ||
466 | } | ||
467 | |||
468 | void MACvDisableBarkerPreambleMd(PSDevice pDevice) | ||
469 | { | ||
470 | BYTE pbyData[2]; | ||
471 | |||
472 | |||
473 | pbyData[0] = 0; | ||
474 | pbyData[1] = EnCFG_BarkerPream; | ||
475 | |||
476 | CONTROLnsRequestOut(pDevice, | ||
477 | MESSAGE_TYPE_WRITE_MASK, | ||
478 | MAC_REG_ENCFG2, | ||
479 | MESSAGE_REQUEST_MACREG, | ||
480 | 2, | ||
481 | pbyData | ||
482 | ); | ||
483 | } | ||
484 | |||
485 | |||
486 | void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval) | ||
487 | { | ||
488 | BYTE pbyData[2]; | ||
489 | |||
490 | pbyData[0] = (BYTE) (wInterval & 0xff); | ||
491 | pbyData[1] = (BYTE) (wInterval >> 8); | ||
492 | |||
493 | CONTROLnsRequestOut(pDevice, | ||
494 | MESSAGE_TYPE_WRITE, | ||
495 | MAC_REG_BI, | ||
496 | MESSAGE_REQUEST_MACREG, | ||
497 | 2, | ||
498 | pbyData | ||
499 | ); | ||
500 | } | ||